簡體   English   中英

檢查當前線程是否是主線程

[英]Check if current thread is main thread

我怎樣才能檢查當前線程是否是linux上的主線程? 看起來像gettid()只返回一個pid,但似乎linux不保證帶有main()的線程總是有一個const和統一的pid。

這樣做的原因是我有一個自動並行化,我想確保在已經由pthread_create()創建的線程上運行的函數中不調用pthread_create()。

對於Linux:

如果getpid()返回與gettid()相同的結果, gettid()它就是主線程。

int i_am_the_main_thread(void)
{
  return getpid() == gettid();
}

來自man gettid

gettid()返回調用者的線程ID(TID)。 在單線程進程中,線程ID等於進程ID(PID,由getpid(2)返回 在多線程進程中,所有線程都具有相同的PID,但每個線程都具有唯一的TID。

來自man clone

線程組是Linux 2.4中添加的一項功能,用於支持共享單個PID的一組線程的POSIX線程概念。 在內部,該共享PID是線程組的所謂線程組標識符(TGID)。 從Linux 2.4開始,對getpid(2)的調用返回調用者的TGID。

組內的線程可以通過它們的(系統范圍的)唯一線程ID(TID)來區分。 函數結果返回給clone()的調用者時,新線程的TID可用,並且線程可以使用gettid(2)獲取自己的TID。

那么使用pthread_self()呢?

這將返回調用線程的thread_id 使用此函數,您可以存儲主線程ID(當您知道是main時),並稍后將其與pthread_self()返回的其他值進行比較,以確定它們是主線程還是另一個。

雖然我認為擁有結構良好的代碼更明智。 類似於在從屬線程中執行的函數以及在線程中執行的其他函數。 這是解決此類問題的更好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM