2011-03-23 33 views
0

我仔細檢查了我在維護的某些代碼中所做的一些假設。main()的pthread ID默認爲0嗎?

我正確理解程序的main()的pthread ID總是被定義爲0嗎?

因此,舉例來說:

#include <pthread.h> 
#include <cstdio> 

int main(){ 
    printf("Main ID is %X\n", (unsigned int)pthread_self()); 
} 

將始終打印0?

這似乎是它在我自己的系統上的工作原理(Linux,GNU_LIBPTHREAD_VERSION是:NPTL 2.11.1),但是我還沒有設法在對pthread庫的各種解釋中找到對此定義的任何引用。我想知道這種行爲是否可靠和便攜,還是隻是本地僥倖。謝謝!

回答

4

pthread_t應視爲不透明類型;有一個函數pthread_equal(),您應該使用它來比較線程pthread_t對象。強制轉換爲unsigned int肯定是未定義的行爲,與使用==比較int。

+0

...好點。很高興我在檢查。 – Ziv 2011-03-23 12:26:52

1

一位名叫「失業的俄羅斯人」的人編輯了我的其他答案,包括以下內容;我個人不會購買它,但也許有一些東西呢?

此外,你得到的零僅僅是因爲你根本沒有連接libpthread。試想一下:

#include <pthread.h> 
#include <cstdio> 

int main(){ 
    printf("Main ID is %lx\n", (unsigned long)pthread_self()); 
} 

$ g++ -g t.c && ./a.out 
Main ID is 0 
$ g++ -g t.c -pthread && ./a.out 
Main ID is 7fd1a288d720 

我不買這個,因爲我的MacBook,我得到

$ g++ -g t.c && ./a.out 
Main ID is a092e720 
+1

這是特定於實現的。當然,有一些(IMO破壞的)實現,其中真正的'pthread_self'在'libpthread'中,而存根pthread函數存在於主libc中,所以如果發生這種情況我一點都不感到驚訝。另一方面,它絕對不是你可以依賴的東西。 – 2011-05-21 15:04:43