繁体   English   中英

在std :: thread或pthread_create中创建的QObject的QThreadData是什么?

[英]What is the QThreadData of a QObject which is created within std::thread or pthread_create

每当创建QObject时,QT都会在其构造函数中将QThreadData分配给QObject。 除其他外,此QThreadData然后用于检查与QObject相关联的事件循环的存在。

当使用Qt线程工具(例如QThread或通过单线程应用程序中的QCoreApplication隐式)时,Qt会为QThreadData分配有意义的值,并且一切都会按预期进行。

但是,以下源代码暗示在手动系统接口线程工具中创建的QObject(例如在pthread_create或std :: thread中)将仅从上次QT线程工具调用中复制最后的QThreadData :(将代码复制从/qt5/qtbase/src/corelib/thread/qthread_unix.cpp中定义了HAVE_TLS)

// Utility functions for getting, setting and clearing thread specific data.
static QThreadData *get_thread_data()
{
#ifdef HAVE_TLS
    return currentThreadData;
#else
    pthread_once(&current_thread_data_once, create_current_thread_data_key);
    return reinterpret_cast<QThreadData *>(pthread_getspecific(current_thread_data_key));
#endif
}

在上面的代码示例中,“ currentThreadData”是静态变量,该静态变量是在任何QT线程工具调用(例如QThread)期间由QT预先设置的。

我的问题是:

  1. 我的理解正确吗?
  2. 如果是,这是否会导致在完全错误的eventLoop(与QT设置的最后一个“ currentThreadData”关联的事件循环)中调用到此QObject中的插槽的QueuedConnection。
  3. 如果不是,QT如何理解在pthread_create中创建的Qobject与任何事件循环都没有关联?

(请注意,我始终假设QObject的父对象设置为NULL。因为当为QObject设置父对象时,会直接从该父对象复制QThreadData,并且一切都会再次正常进行。)

我不确定我是否完全理解这个问题。 但是,当你说...

“ currentThreadData”是静态变量,该静态变量由QT在任何QT线程工具调用(例如QThread)期间预先设置。

...您遗漏了一个要点: currentThreadData也被声明为thread local

在我正在查看的代码库中( Qt 5.13.0 )它是...

static __thread QThreadData *currentThreadData = 0;

其中__thread是编译器特定的扩展,它实际上提供与c++11关键字thread_local相同的线程本地存储持续时间。

因此,一个线程看到的currentThreadData变量与其他任何线程看到的currentThreadData变量完全分开。

暂无
暂无

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

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