2012-04-05 53 views
1

我曾經在pthread_exit()遇到麻煩。我知道有沒有辦法用pthread_exit()的方式像pthread_exit()與本地變量的地址有時起作用?

pthread_exit(&some_local_variable); 

我們總是需要使用了pthread_exit(),如:

pthread_exit("Thread Exit Message or something necessary information"); 

我曾經編碼測試目的一個簡單的程序。 我做了四個線程函數分別加,減,乘和除兩個整數。然後,當在四個不同的線程上執行這些操作時,我試圖返回pthread_exit()的操作結果。我的意思是一樣的東西:

pthread_exit(&add_result); 

當我運行的代碼在CentOS 6的,我得到了想要的結果(即從所有線程垃圾值)作爲pthread_exit()不能這樣使用。但是,我感到困惑。因爲我第一次在Ubuntu 11.10中運行該代碼,並從三個線程得到了三個絕對正確的結果(操作的正確結果),並從一個線程得到了垃圾值。這讓我感到困惑,因爲三個線程爲什麼會給出正確的操作結果?

此外,我對這些線程使用了不同的睡眠時間。我發現睡眠時間最少的線程給了垃圾值。

由於gcc是這兩種操作系統的編譯器,爲什麼一個系統有這樣的錯誤? 它混淆了像我這樣的新手程序員。如果它不是一個bug,任何人都可以向我解釋爲什麼會發生這種情況?

+4

事情有效的事實並不意味着它是正確的...:) – Saphrosit 2012-04-05 11:20:43

+1

只是一個音符。你不總是*必須返回字符串常量。例如,你可以在'malloc()'內存中存儲一​​個值,然後返回'malloc'指針。重點是:返回**線程退出後保持有效的任何**地址。 – ArjunShankar 2012-04-05 11:27:32

+0

謝謝。我應該知道的。 – 2012-04-06 11:54:07

回答

2

pthread_exit只需要一個指向void的指針。如果將局部變量的地址傳遞給線程,那麼有時候該內存將被重用於其他內容。有時它仍然會在那裏。不能保證在線程退出後,系統的某些部分將會去並確保它所使用的所有內存都被設置爲垃圾值。

這不是一個錯誤 - 系統完全按照你的要求進行。

獎勵相關答案 - Can a local variable's memory be accessed outside its scope?

+1

你可能還想提一下,不僅你可以得到正確的OR垃圾值,而且程序也會崩潰(因爲你訪問了你不應該存儲的內存位置):即'未定義的行爲'。 – ArjunShankar 2012-04-05 11:26:25

+0

非常感謝你... – 2012-04-06 11:52:56

2

我認爲你的答案是pthread_exit doc。你說你返回了一個指針add_result,這似乎是一個局部變量。

這裏是文檔的可能回答的話:一個線程終止

後,訪問本地(自動)線程的 變量的結果是不確定的。因此,對於pthread_exit()value_ptr參數 值,不應使用對現有線程的本地變量的引用 。

您可以使用線程函數的void *參數來使用一個結構,該結構應該包含您的操作的實際結果。

+0

感謝您的回答。我沒有這樣想。但我主要關心的是爲什麼兩個系統的行爲不同。這不應該發生。或者如果發生,爲什麼? – 2012-04-05 11:34:44

+0

你在ubuntu系統上多次嘗試過嗎?也許1.這是上下文依賴2.執行依賴 – Aif 2012-04-05 11:35:46

+0

謝謝..我嘗試了好幾次。即使在我的辦公室,我也會在演示中展示它。可能是實施依賴。當只使用一個線程時,我會得到所需的結果。但是當我使用四個時,我就說明了情況。 – 2012-04-06 11:52:36

0

pthread_exit(foo),唯一的要求是,foo指向一些東西,活得足夠長。局部變量不,malloc的內存。