QT线程之可重入与线程安全(深入理解)

前言:

转载请附上连接,本帖原创请勿照抄。

可重入:    可以被多个线程同时调用,那么这个类被称为是“可重入”的。

线程安全:假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。

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

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)”用来标记类和函数,来表明怎样在多线程应用程序中使用它们:

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

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

其它线程文章:

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/110235596

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

猜你喜欢

转载自blog.csdn.net/qq_37529913/article/details/110224166