QT线程之可重入与线程安全

举报
华为云 断点 发表于 2023/02/16 19:40:17 2023/02/16
【摘要】 QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等文章。

 QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等文章。

可重入:    可以被多个线程同时调用,那么这个类被称为是“可重入”的。线程安全:假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。

1、重入为什么非安全线程  例如有多个线程同时访问一个函数或者某段代码的某个变量的时候,多个线程因为同时执行一块代码有的快有的慢从而导致了线程调用顺序的混乱。那么函数返回结果或者变量的结果肯定和预设的结果不同,那么可重入性肯定就是非安全线程。

2、什么是安全线程  QMutexLocker类在构造函数中自动对mutex进行加锁,在析构函数中进行解锁。随便一提的是,mutex使用了mutable关键字来修饰,因为我们在value()函数中对mutex进行加锁与解锁操作,而value()是一个const函数。 
大多数Qt类是可重入,非线程安全的。有一些类与函数是线程安全的,它们主要是线程相关的类,如QMutex,QCoreApplication::postEvent()。

本文作者原创首发于CSDN,本文原创请勿转载

版权声明:本文为CSDN博主「双子座断点」的原创文章,遵循CC 4.0 BY-SA版权协议。
原文链接:https://blog.csdn.net/qq_37529913/article/details/110127940

上面这两条是我总结的,下面将详细举例说明重入和线程安不安全情况。

1、重入为什么非安全线程

    这个我就不自己实现了,找了一段大部分博客都有的代码过来和大家说明。

    例如有多个线程同时访问一个函数或者某段代码的某个变量的时候,多个线程因为同时执行一块代码有的快有的慢从而导致了线程调用顺序的混乱。那么函数返回结果或者变量的结果肯定和预设的结果不同,那么可重入性肯定就是非安全线程。

class Counter
{
  public:
      Counter() {n=0;}
      void increment() {++n;}
      void decrement() {--n;}
      int value() const {return n;}
 private:
      int n;
};

2、什么是安全线程

    这个也就不具体举例了,把我的几篇文章在结尾给大家附加上。

    前面几篇文章也有具体例子和说明,在这里使用了锁实现了控制线程访问,第一个线程还没有执行完之前,第二或第N个线程处于被阻塞状态所以实现了安全线程。

    QMutexLocker类在构造函数中自动对mutex进行加锁,在析构函数中进行解锁。随便一提的是,mutex使用了mutable关键字来修饰,因为我们在value()函数中对mutex进行加锁与解锁操作,而value()是一个const函数。 
大多数Qt类是可重入,非线程安全的。有一些类与函数是线程安全的,它们主要是线程相关的类,如QMutex,QCoreApplication::postEvent()。

class Counter
{
public:
     Counter() { n = 0; }
     void increment() { QMutexLocker locker(&mutex); ++n; }
     void decrement() { QMutexLocker locker(&mutex); --n; }
     int value() const { QMutexLocker locker(&mutex); return n; }
private:
     mutable QMutex mutex;
     int n;
};

在查看Qt的帮助文档时,在很多类的开始都写着“All functions in this class are reentrant”,或者“All functions in this class are thread-safe”。在Qt文档中,术语“可重入(reentrant)”和“线程安全(thread-safe)”用来标记类和函数,来表明怎样在多线程应用程序中使用它们:

一个线程安全的函数可以同时被多个线程调用,即便是这些调用使用了共享数据。因为该共享数据的所有实例都被序列化了。

一个可重入的函数也可以同时被多个线程调用,但是只能是在每个调用使用自己的数据时。

以下文章均为作者原创文章,看完记得收藏、关注加👍

线程、进程、多线程、线程池一文看懂从此秒变大佬!:https://blog.csdn.net/qq_37529913/article/details/115533429

QT 初识线程(简单实现):https://blog.csdn.net/qq_37529913/article/details/110127940

QT QMutex使用详解:https://blog.csdn.net/qq_37529913/article/details/110187452

QT 线程之QSemaphore(深入理解):https://blog.csdn.net/qq_37529913/article/details/110187121

QT线程 Emit、Sgnals、Slot详细解释:https://blog.csdn.net/qq_37529913/article/details/110211435

QT 线程之QWaitCondition(深入理解):https://blog.csdn.net/qq_37529913/article/details/110212704

Qt 多线程之线程事件循环(深入理解):https://blog.csdn.net/qq_37529913/article/details/110229382

QT线程之QObjects(深入理解):https://blog.csdn.net/qq_37529913/article/details/110228837

QT线程之可重入与线程安全(深入理解):https://blog.csdn.net/qq_37529913/article/details/110224166

QT 主线程子线程互相传值:https://blog.csdn.net/qq_37529913/article/details/110506178

QT线程同步与异步处理:https://blog.csdn.net/qq_37529913/article/details/110521759

QT 多线程之线程池QThreadPool(深入理解):https://blog.csdn.net/qq_37529913/article/details/115536799

QT之浅拷贝、深拷贝、隐式共享(深度理解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596

QT 隐式共享机制对STL样式迭代器的影响:https://blog.csdn.net/qq_37529913/article/details/110252454

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。