请选择 进入手机版 | 继续访问电脑版

Q1024[专业C/C++]

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1095|回复: 0

QT的重入和线程安全[翻译+思考]

[复制链接]

61

主题

65

帖子

426

积分

中级会员

Rank: 3Rank: 3

积分
426
发表于 2021-12-24 10:15:34 | 显示全部楼层 |阅读模式
本帖最后由 xingzaicpp 于 2021-12-24 10:32 编辑

翻译自https://doc.qt.io/qt-5/threads-reentrancy.html,同时贴到2楼.


重入和线程安全
在整个文档中,术语可重入和线程安全用于标记类和函数-----以指示如何在多线程应用程序中使用它们:
线程安全函数,可以同时被多个线程调用,即使调用使用了共享数据,因为对共享数据的使用已序列化。
可重入函数也可以被多个线程同时调用,条件是只有当每个调用使用自己的数据。

因此,线程安全函数总是可重入的,但可重入函数并不总是线程安全的。

如果一个类的成员函数可以被多个线程安全地调用,只要每个线程使用该类的不同实例,则称该类是可重入的。如果一个类可以被多个线程安全地调用其成员函数,则该类是线程安全的,条件是所有线程都使用该类的相同实例。
注意: Qt 类仅在打算由多个线程使用时才记录为线程安全的。[翻译注: 肯定啊, 为了效率啊]
           如果一个函数未标记为线程安全或可重入,则不应在不同线程中使用它。
           如果一个类未标记为线程安全或可重入,则不应从不同线程访问该类的特定实例。
重入性
C++ 类通常是可重入的,因为它们通常只访问自己的成员数据。任何线程都可以在可重入类的实例上调用成员函数,条件是没有其他线程会同时调用该类的同一实例上的成员函数。例如,Counter下面的类是可重入的:
[C++] 纯文本查看 复制代码
class Counter
{
public:
    Counter() { n = 0; }

    void increment() { ++n; }
    void decrement() { --n; }
    int value() const { return n; }

private:
    int n;
};

该类不是线程安全的,因为如果多个线程尝试修改数据成员n,结果是未定义的。这是因为++and--运算符并不总是原子的。事实上,它们通常扩展为三个机器指令:
    1.将变量的值加载到寄存器中。
    2.增加或减少寄存器的值。
    3.将寄存器的值存储回主存储器。


线程安全
显然,访问必须是序列化的:线程 A 必须不间断地(原子地)执行步骤 1、2、3,然后线程 B 才能执行相同的步骤;或相反亦然。使类线程安全的一种简单方法是使用QMutex保护对数据成员的所有访问:

[C++] 纯文本查看 复制代码
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 类是可重入的,但它们没有成为线程安全的,因为使它们成为线程安全会导致重复锁定和解锁QMutex的额外开销。例如,QString是可重入的,但不是线程安全的。您可以同时从多个线程安全地访问QString 的不同实例,但不能同时从多个线程安全地访问QString的同一个实例(除非您使用QMutex保护自己的访问)。

一些 Qt 类和函数是线程安全的。这些主要是与线程相关的类(例如QMutex)和基本函数(例如QCoreApplication::postEvent ())。

注意:多线程领域中的术语并未完全标准化。POSIX 使用可重入和线程安全的定义,它们的 C API 略有不同。在 Qt 中使用其他面向对象的 C++ 类库时,请确保理解定义。

QT帮助说明:
QT会在类中描述其是否可重入,如图:
Snap3.png

问题来了:
多线程只读访问QString或者QT的容器,是否可行.
我个人谨慎表示可行, 且我没法论证,以下图片是参考
Snap4.png




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Q1024

GMT+8, 2022-8-8 07:01 , Processed in 0.010292 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表