美文网首页
Qt:可重入和线程安全

Qt:可重入和线程安全

作者: Alliawell | 来源:发表于2019-10-25 14:48 被阅读0次

线程安全函数也是可重入函数,但可重入不一定是线程安全。

A thread-safe function is always reentrant, but a reentrant function is not always thread-safe.

线程安全函数:可以同步被多线程调用,即便访问了共享的数据,因为对共享数据的访问是序列化的。

可重入函数:仅在每个调用使用自己的数据时(如栈空间),才能被多线程调用。

(Qt对可重入函数的解释和其他地方的解释不同。)

作为扩展,一个类可重入,表示它的成员函数可以在多线程里调用,前提是每个线程使用一个不同的类对象。

一个类线程安全,表示多个线程可以同时调用其成员函数,即使这些线程使用的是同一个对象。

class Counter

  {

  public:

      Counter() { n = 0; }

      void increment() { ++n; }

      void decrement() { --n; }

      int value() const { return n; }

  private:

      int n;

  };

上面的类是可重入的,但不是线程安全的。

因为++和--操作不是原子的,实际上通常需要3个机器指令:

1. 将变量的值载入到寄存器中;

2.改变寄存器的值;

3.把寄存的值写回到变量中。

如果线程A和线程B同时载入了变量的值,然后增1,结果是值只被增加1次。

下面的类是线程安全的:

  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的许多类都是可重入的,但不是线程安全的。要做到线程安全,就要加很多的锁,这会影响性能。

注意:Qt的类只有被明确标为线程安全(thread-safe),才可以在多线程里使用。

相关文章

  • Qt 可重入和线程安全

    可重入和线程安全 本文翻译自Qt官网:重入和线程安全[https://doc.qt.io/qt-5/threads...

  • Qt:可重入和线程安全

    线程安全函数也是可重入函数,但可重入不一定是线程安全。 A thread-safe function is alw...

  • 锁 - 可重入 vs 不可重入

    可重入锁 在多线程编程和信号处理过程中,经常会遇到可重入(reentrance)和线程安全(thread-safe...

  • 线程安全

    线程安全 线程安全定义:线程间共享可变资源(内存)。 实现线程安全的方法:不共享资源。使用可重入函数,不对外部资源...

  • 操作系统相关

    1、什么是可重入函数 可重入函数是指能够被多个线程“同时”调用的函数(线程安全),并且能够保证结果的正确性的函数。...

  • 可重入与线程安全

    一个函数对多个线程来说是可重入的,则说这个函数是线程安全的,但是并不能说明对信号处理函数来说该函数也是可以重入的。...

  • 可重入与线程安全

    线程安全(thread safety)是指在多线程环境下,不同的线程在同一时刻能够安全访问临界区的能力,它可以让代...

  • 可重入与线程安全

    在多任务系统下,中断可能在任务执行的任何时间发生,同时也可能在任务执行过程中发生系统调度而将执行转向另一个线程,如...

  • 线程安全与可重入

    线程安全 线程安全问题是由于线程之间存在共享变量(共享资源、临界资源、临界区)引起的。由于CPU的调度,多个线程访...

  • Java中的各种锁

    一个线程中的多个流程能不能获取同一把锁:可重入锁和非可重入锁 可重入锁 可重入性:表明了锁的分配机制,是基于线程的...

网友评论

      本文标题:Qt:可重入和线程安全

      本文链接:https://www.haomeiwen.com/subject/dcvsvctx.html