2012-05-03 27 views
10

考慮以下幾點:pthread_create()如何工作?

pthread_t thread; 
pthread_create(&thread, NULL, function, NULL); 
  • 究竟pthread_create做些什麼來thread

  • thread在加入主線程並終止之後會發生什麼?

  • 如果thread後加入了會發生什麼事,你這樣做:

    pthread_create(&thread, NULL, another_function, NULL); 
    
+4

我被低估了......爲什麼?這是一個關於編程的具體問題。 –

+1

+1,瞭解實現細節總是很好的。 –

+0

關於開源的好處是源代碼是開放的。您可以隨時下載pthread的源代碼並檢查出來。 – mfontanini

回答

5

pthread_create做什麼線程?

thread是一個對象,它可以保存一個值來標識一個線程。如果pthread_create成功,它將填充一個標識新創建的線程的值。如果失敗,則呼叫後的值thread未定義。 (參考:http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

線程在它加入主線程並終止後會發生什麼?

什麼也沒有發生的對象,但它擁有不再是值是指任何線程(因此,例如,你可以不再把它傳遞給需要pthread_t功能,如果你不小心做,那麼你可能會得到ESRCH錯誤回來)。

如果線程已經加入後,你這樣做會發生什麼:

和以前一樣:如果pthread_create成功,分配一個值,標識新創建的線程。

2

在pthread_create將創建一個使用OS調用線程。關於抽象的奇妙之處在於你並不需要關心下面發生的事情。它會將變量線程設置爲等於可用於引用該線程的標識符。例如,如果你有多個線程,並要取消其中一個僅僅使用權的pthread_t標識符指定自己感興趣的線程中調用

pthread_cancel可以(線程)

加入主線程後線程發生什麼變化,並終止了 ?

在線程終止前,var線程作爲一個鍵/索引來獲取或標識一個線程。線程終止鍵/索引指向的值不再必須有效。你可以保留它並嘗試重用它,但這幾乎肯定會導致錯誤。

如果線程已經加入後,你這樣做會發生什麼:

pthread_create(&thread, NULL, another_function, NULL); 

沒有問題,因爲你給它一個參考線程的線程的值將被設置爲一個標識剛剛創建的新線程。我懷疑它可能會和以前一樣,但我不會指望它。

+1

你怎麼知道'pthread_join'不修改對象。該對象是不透明的。你不能(也不應該)知道每個調用對你作爲參數傳遞的'pthread_t'對象有什麼作用。你所知道的是,它被用來識別其他'pthread_ *'調用中的線程。 –

+0

@Loki,'pthread_join'按值取其''pthread_t'參數;它不會影響它的價值。它當然可以修改「pthread_t」值所標識的「對象」,但這是一個單獨的問題,保羅的答案從未提及過。這是'free'不會修改它傳遞的指針的方式。 –

+1

@RobKennedy:你在做假設。如果pthread_t是一個指針,該怎麼辦?然後您可以輕鬆修改對象。但我們錯過了這一點。關鍵是**你不知道(也不應該知道)**函數對對象做了什麼。該對象是**不透明**的原因。 –