2014-02-07 56 views
0

首先,我是新的pthreads,所以如果我完全誤解了,請讓我知道。困惑pthreads

我已經搜索了返回值的正確方法,並遇到此鏈接How to return a value from thread in Chttps://linuxprograms.wordpress.com/category/pipes/

因此,我可以共享由開始線程或管道信息控制的位置,但最後一個值不能放在某個堆棧上?爲什麼我return的方式與(例如bash)調用時的程序不同? (根據我的理解,如果它是C++,將有可能具有常規返回值,但是(根據我讀的內容,我認爲在這裏可能是https://computing.llnl.gov/tutorials/pthreads/)POSIX並沒有完全爲C++定義,只是C++。 )

+2

建議:'std :: thread' – Aleph

+0

您正在尋找的聲音['pipe()'](http://pubs.opengroup.org/onlinepubs/009695399/functions/pipe.html)而不是線程。 ..你在加入後獲得「返回值」後? –

+0

AnotherTest,是不是std ::線程的C + + 11的pthread實現?πάνταῥεῖ,不,它必須使用pthreads。 – ConfusedStack

回答

2

看看pthread_exit和pthread_join。

當你與你的線程做,你可以撥打pthread_exit(void* retval)

的了pthread_exit()函數可用來終止調用線程,並通過RETVAL返回 的值(如果 線程加入)是提供給另一線程在調用pthread_join(3)的同一進程中。

這調用了pthread_exit將停止你的線程和,因爲它說,存儲返回值,其中在pthread_join可以得到它,並把它在它的第二個參數:int pthread_join(pthread_t thread, void **retval);

當你調用pthread_join(tid, &returnVal);其中TID是一個pthread_t,returnVal現在將持有指向返回的值的指針pthread_exit

這允許您將數據從其出口處的線程傳出。

+4

如果'pthread_exit'是* not *,那麼'&retval'同樣會保持從線程返回的似乎全部經常被忽略的void *在線程上調用,而不是簡單地讓thread-proc完成並返回一些東西。我更喜歡這種方法,特別是當我有局部範圍的C++對象需要銷燬時。 – WhozCraig

1

每個線程都有自己的堆棧和本地環境以及父進程。你的主進程創建一個線程(主線程),並在你的代碼下運行它。你創建的任何其他線程都會得到相同的處理:每個線程獲得一個堆棧,一個線程上下文,線程本地存儲(如果適用),並且沒有公共堆棧來返回值。

當您加入您開始的線程時,會發生什麼情況是您正在等待它完成執行。這將解除等待的阻止,但不會返回任何用戶值,因爲通常情況下,線程,其堆棧及其進程中的所有環境都將被銷燬。 線程正在運行時,它們可以按照您提到的方式相互通信,並且只要您使用同步機制來序列化這些訪問,它們也可以讀/寫公用內存位置。

如果您必須從線程獲得返回值,那麼您可能希望將其封裝在類中,在開始時將其傳遞給類實例,然後在線程退出之前,可以在其中留下「返回值」這個類的成員,所以你可以在類「run」或「start」方法(實際運行線程的那個方法)返回之後檢查它。

希望這會有所幫助。