gpt4 book ai didi

c++ - 在 std::thread 或 pthread_create 中创建的 QObject 的 QThreadData 是什么

转载 作者:行者123 更新时间:2023-11-28 04:14:00 27 4
gpt4 key购买 nike

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

当使用 Qt 线程设施时(例如 QThread 或在单线程应用程序中通过 QCoreApplication 隐式使用),Qt 将有意义的值分配给 QThreadData 并且一切都按预期工作。

但是,以下源代码暗示在手动系统接口(interface)线程工具(例如在 pthread_create 或 std::thread 中)中创建的 QObject 将简单地从最后一个 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. 如果是,这是否会导致在完全错误的事件循环(与 QT 设置的最后一个“currentThreadData”关联的事件循环)中调用此 QObject 中的插槽的 QueuedConnection
  3. 如果不是,QT 如何理解在 pthread_create 中创建的 Qobject 不与任何事件循环相关联?

(请注意,我总是假设 QObject 的父级设置为 NULL。因为当为 QObject 设置父级时,QThreadData 直接从该父级复制,一切再次正常工作。)

最佳答案

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

"currentThreadData" is a static variable which is previously set by the QT during any QT threading facility call (e.g. QThread).

...您错过了重要的一点:currentThreadData 也被声明为 thread local

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

static __thread QThreadData *currentThreadData = 0;

在哪里__thread是一个编译器特定的扩展,它本质上提供与 c++11 关键字相同的线程本地存储持续时间 thread_local .

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

关于c++ - 在 std::thread 或 pthread_create 中创建的 QObject 的 QThreadData 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57061263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com