【问题标题】:QObject reentrancy and thread safetyQObject 重入和线程安全
【发布时间】:2013-12-18 12:15:11
【问题描述】:

this的文章中说: 一些 QObject 是可重入的,因此可以同时从多个线程中使用这些类

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

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

请注意,这些类被设计为在单个线程中创建和使用;在一个线程中创建对象并从另一个线程调用其函数并不能保证有效。

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

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

QObject 重入

QObject 是可重入的。它的大部分非 GUI 子类,例如 QTimer、QTcpSocket、QUdpSocket、QFtp 和 QProcess,也是可重入的,使得使用这些类成为可能 同时来自多个线程。请注意,这些类是 设计为在单个线程中创建和使用;创造 一个线程中的对象并从另一个线程调用其函数 不保证能正常工作。

【问题讨论】:

标签: c++ multithreading qt


【解决方案1】:

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

重入和线程安全

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

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

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

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

注意:仅当 Qt 类打算由多个线程使用时,它们才被记录为线程安全的。如果函数未标记为线程安全或可重入,则不应从不同的线程中使用它。如果一个类未标记为线程安全或可重入,则不应从不同线程访问该类的特定实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多