[英]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(¤t_thread_data_once, create_current_thread_data_key);
return reinterpret_cast<QThreadData *>(pthread_getspecific(current_thread_data_key));
#endif
}
在上面的代码示例中,“ currentThreadData”是静态变量,该静态变量是在任何QT线程工具调用(例如QThread)期间由QT预先设置的。
我的问题是:
(请注意,我始终假设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.