繁体   English   中英

QObject重入和线程安全

[英]QObject reentrancy and thread safety

文章中,有人说: 有些的QObject是可重入,使其能够同时使用这些类从多个线程

我认为一段可重入的代码也应该是线程安全的。

但是,同一篇文章继续说:

注意,这些类旨在从单个线程中创建和使用。 不能保证在一个线程中创建对象并从另一个线程调用其功能。

这不是矛盾的吗? 到底是什么意思? 我可以安全地跨线程调用QObject函数吗?

我已经复制了以下文章的相关部分:

QObject重入

QObject是可重入的。 它的大多数非GUI子类(例如QTimer,QTcpSocket,QudpSocket,QFtp和QProcess)也都是可重入的,从而使得可以同时使用多个线程中的这些类。 注意,这些类旨在从单个线程中创建和使用。 不能保证在一个线程中创建对象并从另一个线程调用其功能。

我认为以下文档中的以下引用应该可以帮助您了解它们之间的区别。 简而言之,请注意,您引用的第一个引用是关于类本身的,第二个引用是作为类的实例的对象。

重入和线程安全

在整个文档中,术语“可重入”和“线程安全”用于标记类和函数,以指示它们如何在多线程应用程序中使用:

  • 即使调用使用共享数据,也可以从多个线程中同时调用线程安全函数,因为对共享数据的所有引用都已序列化。

  • 重入函数也可以从多个线程中同时调用,但前提是每次调用都使用自己的数据。

通过扩展,如果可以从多个线程安全地调用其成员函数,则该类称为可重入的,只要每个线程使用该类的不同实例即可。 如果可以从多个线程安全地调用其成员函数,则该类是线程安全的,即使所有线程都使用该类的相同实例也是如此。

注意:如果打算将Qt类用于多个线程,则仅将它们记录为线程安全的。 如果某个函数未标记为线程安全或可重入,则不应在其他线程中使用该函数。 如果某个类未标记为线程安全或可重入,则不应从其他线程访问该类的特定实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM