2011-03-29 63 views

回答

3

如果pthread_join()的兩個預期參數中的第一個爲NULL,則在運行時可能發生任何錯誤。根據www.opengroup.org上的規範:「如果pthread_join()的線程參數指定的值沒有引用可連接線程,則行爲未定義。」

NULL接受pthread_join()的第二個參數。

編輯:確實有些實現可以指定行爲。在你的系統上檢查手冊頁上的pthread_join。

+0

一些實現定義了這種行爲,例如Linux手冊頁聲稱,如果thread_id不對應一個線程,它會立即返回'errno'設置爲'ESRCH'(儘管對我來說它傳遞NULL時簡單地崩潰) – Cubbi 2011-03-29 14:44:41

+0

@Cubbi:一個有效的觀察;謝謝! - 但聽起來在實踐中它仍然可以是UB? – 2011-03-29 14:49:53

+0

不斷地引用規範,但不能告訴man第一個參數是一個無符號的long值,而不是一個指針。 /usr/include/bits/pthreadtypes.h:typedef unsigned long int pthread_t;函數簽名:int pthread_join(pthread_t thread,void ** value_ptr); – user237419 2011-03-29 14:57:57

9

你得到一個編譯時錯誤; pthread_join()預計2個參數:)

+0

+1真的! hahah – karlphillip 2011-03-29 14:37:43

+0

:P:P XXXXXXXXXX – user237419 2011-03-29 14:38:12

+0

假設我用NULL,NULL來調用它 - 會好嗎? (或者它是否正在等待非NULL pthread?) – Zach 2011-03-29 14:38:18

0

理想情況下,你會經常檢查函數返回

if (0 != pthread_join(thread, &result)) 
{ 
    fprintf(stderr, "pthread_join error\n"); 
} 

如果成功,在pthread_join()函數返回零。否則,將返回一個錯誤編號以指示錯誤。

+0

無論你試圖傳遞給函數,檢查返回,你都會知道發生了什麼! – karlphillip 2011-03-29 14:39:19

+1

是的,如果你曾經去檢查:) – user237419 2011-03-29 14:48:15