2012-07-13 88 views
7

是任何可釋放的方式在c + + 11檢測是否當前線程是主線程?或者,我必須手動保存主線程的線程ID與std::this_thread::get_id(),然後有一個這樣的程序:std ::線程檢測主線程

bool isMainThread() 
{ 
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id(); 
} 

有沒有做到這一點的常用方法?上述解決方案是否有效?

謝謝

+2

您也可以在線程本地存儲中設置一個標誌,但我不確定此時TLS是否廣泛可用。 – dasblinkenlight 2012-07-13 11:21:51

回答

8

你是什麼意思的主線程?如果你的意思是執行main()的線程,那麼你就不可能知道線程是否是主線程。您必須保存其ID,之後您可以使用已保存的 ID通過比較其ID與保存的ID(正如您在問題中猜測的那樣)來確定當前線程是否爲主線程。

要多說明一點,線程沒有層次結構,沒有父線程,即使一個線程創建其他線程也沒有子線程。操作系統不記得哪個線程創建了哪些線程。因此,所有線程都與操作系統和您的程序相同。因此,通過檢測當前線程是否是應用程序中所有其他線程的父代,您無法推斷出main線程。

+1

感謝您的解釋!我真的認爲執行main()的線程!那麼我將手動保存該ID!謝謝! – moka 2012-07-13 11:50:45

+3

非常正確的答案。作爲一個旁註和取決於平臺,在運行FreeBSD,OpenBSD,Mac OS X或iOS的POSIX平臺上,pthread.h中有一個函數 - int pthread_main_np(void);如果線程是主線程,則返回非零值。如果你使用std :: thread產生了一個線程,這個底層函數將正常工作。注意函數末尾的「np」意味着「不可移植」,所以Nawaz仍然有最好的平臺無關答案。 – NSDestr0yer 2014-05-20 23:13:39