簡體   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