在this文章中,据说: 有些QObject是可重入的,因此可以同时使用来自多个线程的这些类。
我认为一段可重入的代码也应该是线程安全的。
但是,同一篇文章继续说:
请注意,这些类旨在从单个线程中创建和使用;在一个线程中创建一个对象并从另一个线程调用它的函数不能保证工作。
这不矛盾吗?它最终意味着什么?我可以安全地跨线程调用QObject函数吗?
我复制了以下文章的相关部分:
QObject Reentrancy
QObject是可重入的。它的大多数非GUI 子类,例如QTimer,QTcpSocket,QUdpSocket,QFtp和 QProcess也是可重入的,可以使用这些类 从多个线程同时。请注意,这些类是 旨在从单个线程中创建和使用;创建 一个线程中的对象,并从另一个线程调用其函数 不能保证工作。
答案 0 :(得分:3)
我认为以下documentation中的以下引用可以帮助您理解它们之间的区别。简而言之,请注意,您引用的第一个引用是关于类本身的写,第二个是作为类实例的对象。
可重入和线程安全
在整个文档中,术语reentrant和thread-safe用于标记类和函数,以指示它们如何在多线程应用程序中使用:
即使调用使用共享数据,也可以从多个线程同时调用线程安全函数,因为对共享数据的所有引用都是序列化的。
也可以从多个线程同时调用可重入函数,但前提是每个调用都使用自己的数据。
通过扩展,如果一个类可以从多个线程安全地调用其成员函数,则称该类是可重入的,只要每个线程使用该类的不同实例即可。如果可以从多个线程安全地调用其成员函数,则该类是线程安全的,即使所有线程都使用该类的相同实例。
注意:如果Qt类打算由多个线程使用,则它们仅记录为线程安全的。如果函数未标记为线程安全或可重入,则不应在不同的线程中使用它。如果某个类未标记为线程安全或可重入,则不应从不同的线程访问该类的特定实例。