2017-02-15 45 views
0

我做這個創建2個線程具有相同的線程ID:pthreads:如果我使用相同的線程ID創建線程,會發生什麼情況?

pthread_t pt; 
int rc1, rc2, t1, t2; 
t1 = 0; 
t2 = 1; 
rc1 = pthread_create(&pt, NULL, func(), (void*)&t1); 
rc2 = pthread_create(&pt, NULL, func(), (void*)&t2); 

func()只是打印傳遞的參數

我發現些什麼是輸出可以是任何的0然後11然後0 。這裏真的發生了什麼?無論如何,這種情況與使用兩個pthread_t值不同嗎?

+0

使用兩個'pthread_t'對象的區別在於,在這種情況下,您無法使用第一個線程進行連接。 – EOF

回答

2

我做這個創建2個線程與相同線程ID:

不,你不是。這不可能。

pthread_create函數創建一個新的線程(具有唯一的ID)並將新線程的ID存儲在作爲第一個參數傳遞的pthread_t中。該參數是out參數,這意味着您傳入的pthread_t的值不會被使用,新值將被存儲到它以供您在完成調用後使用。

你正在做的是用不同的ID創建兩個線程,但是當第二個線程被創建時,你覆蓋了保存第一個ID的變量。

這意味着你只有知道其中一個線程ID,但仍有兩個不同的ID。

如果您不知道第一個線程的ID(因爲您覆蓋存儲該ID的變量),那麼您將無法加入它,或者分離它,或者發送一個信號。

1

我發現輸出可以是0,然後是1或1,然後是0的任何一個。這裏真的發生了什麼?無論如何,這種情況與使用兩個pthread_t值不同嗎?

它不會有任何區別。使用兩個線程ID不會對執行順序產生任何影響。

如果我使用相同的線程ID創建線程,會發生什麼情況?

如果不具有線程ID,那麼你不能加入(使用pthread_join())與它或(使用pthread_signal())將信號發送到它,調整調度參數(使用pthread_setschedparam/pthread_getschedparam)等除此之外,沒關係。

相關問題