QT 如何保证类的线程安全?(让多线程不再崩渍)

1.什么是类的线程安全(或线程安全的类)?
了解多线程的人太概都知道,类地线是玄全比可重入更加严格、它要求在不回线程同过调用类回一实侧的成局画数、而不会发程序的递溃。
2.哪些情况下不用考虑线程安全问题?
2.1在多线程中对bool,int,float,QString等类型的操作,你不用考虑任何安全性问题。
因为你无论以什么方式在不同线程中对这些类型进行操作,都像真正的原子性操作一样(其实不是严格的原子性操作),完全不会引起程序崩溃。我想这可能是QT已经对这些类型进行了线程安全保障。
比如,我下面的这个类本身就是线程安全的:

2.2在多线程中使用信号槽机制进行资源共享时,不用考虑线程安全问题。
例如在两个不同的子线程中通过信号槽将字符串信息传递到Ul线程,用于更新界面的显示,这个操作是线程安全的,因为信号槽作为QT独创的通信机制,是线程安全的。
3.设计一个线程安全的类
3.1先展示一个未进行线程安全保障的类是如何引发崩溃的
定义一个非线程安全的类:

在两个子线程中对这个类的同一实例进行访问:

不出意外,程序运行一分钟以内就会崩溃。
3.2安全写法1使用互斥量QMutex.并使用lock)和unlock0方法进行锁定和解锁,但这个方法难以对返回参数进行保护

3.2安全写法2使用互斥量QMutex,并使用QMutexLocker 进行锁定,当QMutexLocker从栈释放后,自动解锁

3.3安全写法3使用读写锁 QReadWriteLock,并使用 lockForRead0和lockForWrite)对读或写进行保护,这种方法相比QMutex效率更高,因为它允许多线程同时读。

3.4更多保证类的线程安全性的办法
1.使用生产者一消费者模式,通过缓冲区产生多个数据的备份,可提高线程间数据共享的效率
2.使用socket进行线程间,甚至进程间的数据共享3.类不提供访问实例中成员的方法,而是通过信号槽机制,进行线程间的数据共享

Original: https://www.cnblogs.com/ybqjymy/p/16500678.html
Author: 一杯清酒邀明月
Title: QT 如何保证类的线程安全?(让多线程不再崩渍)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540165/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 不止面试-JVM垃圾回收面试题详解

    第一部分:面试题 本次分享我们将尝试回答以下问题: GC 是什么? 为什么要有 GC? 简单说一下java的垃圾回收机制。 JVM的常见垃圾回收算法有哪些? 为什么要使用分代回收机…

    Java 2023年6月15日
    060
  • Spring Boot 操作 Redis

    参考资料 说在前面 步骤 1. 新建 Maven 项目并引入 spring-boot-starter-data-redis 2. 编写 application.yml 3. 编写缓…

    Java 2023年6月9日
    052
  • Python面向对象

    1.面向对象 2.什么是类和类变量? 3.实例和实例化以及实例变量 4.数据成员 5.方法和静态方法以及类方法 6.什么是方法重写 7. _ init _ 8.self 9.类的初…

    Java 2023年6月7日
    079
  • Java全家桶的这些知识,不用学了

    众所周知,Java 的知识体系繁冗复杂,但是有很多知识在实际工作中几乎没有人用。 很多人在学习过程中,却经常把有限的时间和精力花在了这些” 没有用“的知识上…

    Java 2023年6月7日
    065
  • 在项目中导入lombok依赖自动生成有参,无参 空参 方法的注解

    导入依赖 org.projectlombok lombok 1.18.22 provided 注解 @Data //生成set get to string方法 @AllArgsCo…

    Java 2023年6月6日
    069
  • MySQL表历史数据清理总结

    最近工作中在处理线上几个数据表的清理工作,工作虽然简单,但操作起来注意的地方还是挺多的。现将整个过程进行简单的总结,以便作为日后的参考。 首先确定下我们清理数据的期望: 期望清理过…

    Java 2023年6月5日
    0120
  • servlet获取表单数据

    Java servlet获取form表单数据(参数) 在 Servlet 中如何使用 HttpServletRequest 获取请求参数和 request 对象传递数据有哪些方法。…

    Java 2023年6月14日
    0111
  • Android Jetpack Navigation基本使用

    Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navig…

    Java 2023年6月9日
    098
  • RabbitMQ——Virtual Host

    Virtual Host 作用 Virtual Host 本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制; Virtual Host 通过在…

    Java 2023年5月30日
    075
  • 面试突击64:了解 HTTP 协议吗?

    HTTP(Hyper Text Transfer Protocol)超文本传输协议,下文简称 HTTP,它的作用是用于实现服务器端和客户端的数据传输的。它可以传输任意的数据类型,如…

    Java 2023年5月29日
    080
  • 云原生的概念

    云原生其实是一种思想,并不是一种工具,云原生更多的是一种泛化的东西,是一种思想观念,首先要有意识的去想云原生这种东西,其次,他是一种技术、流程和企业管理方法的集合,所谓的技术,k8…

    Java 2023年6月8日
    080
  • nginx负载均衡高可用

    1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。…

    Java 2023年5月30日
    098
  • 设计模式之桥接模式

    桥接模式又称桥梁模式,属于结构型模式,是指将 抽象化 与 实现化 脱耦,使得二者可以独立的变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 抽象…

    Java 2023年6月5日
    0100
  • 深入理解this关键字

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    074
  • 【微服务】- 服务调用-OpenFeign

    服务调用 – OpenFeign 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得…

    Java 2023年6月16日
    079
  • 使用IDEA进行javaDoc时报错:javadoc: 错误-无效的标记: –source-path

    可能是因为idea版本太高 其javadoc生成工具不能使用java8版本了,亦或是需要做一些设置 idea生成javadoc文件使用java8版本时报错 在这里修改一下java版…

    Java 2023年6月6日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球