簡體   English   中英

當一個線程 forks() 時,其他線程會發生什么?

[英]What happens to other threads when one thread forks()?

在 C++ 中使用 pthreads,如果您的一個線程調用 fork,您的其他線程會發生什么情況?

似乎線程沒有跟隨。 在我的例子中,我正在嘗試創建一個守護進程,我使用 fork() 和父進程退出來對其進行去守護進程。 但是,在通過代碼的新路徑中,我在分叉之前和之后創建了一些線程。 有沒有一種簡單的方法可以將線程的所有權更改為新的分叉進程,而不是在分叉之后移動我所有的線程創建?

沒有什么。 只有調用 fork() 的線程才會重復。 子進程必須啟動任何新線程。 父母的線程被單獨留下。

在 POSIX 中,當一個多線程進程 fork 時,子進程看起來就像父進程的副本,但是其中所有線程都停在了它們的軌道上並消失了。

如果線程持有鎖,這是非常糟糕的。

出於這個原因,有一個稱為pthread_atfork的粗略機制,您可以在其中為這種情況注冊處理程序。

任何使用互斥鎖的正確編寫的程序模塊(尤其是可重用的中間件)都必須調用pthread_atfork來注冊一些處理程序,這樣如果進程恰好調用fork ,它就不會出現錯誤行為。

除了互斥鎖之外,線程還可以擁有其他資源,例如使用pthread_setspecific保存的線程特定數據,這些數據只能由線程訪問(並且線程負責通過析構函數清除它)。

在子進程中,沒有這樣的析構函數運行。 地址空間已復制,但線程及其線程特定值不存在,因此 memory 在子進程中泄漏。 這也可以而且應該使用pthread_atfork處理程序來處理。

引用自http://thorstenball.com/blog/2014/10/13/why-threads-cant-fork/

If we call fork(2) in a multi-threaded environment the thread doing the call is now the main-thread in the new process and all the other threads, which ran in the parent process, are dead. And everything they did was left exactly as it was just before the call to fork(2).

所以我們在使用它們之前應該三思而后行

分叉一個線程通常是非常糟糕的。 分叉進程應該是父進程的完整副本,但線程不是。 有一個 function pthread_atfork()有時會有所幫助。 如果必須 fork 一個線程,最好在fork()之后立即調用exec() ) 。

我建議您在fork()pthread_atfork()的文檔中閱讀 POSIX 開發人員的警告(參見http://pubs.opengroup.org/onlinepubs/007904975/functions/fork.htmlhttp://pubs.opengroup .org/onlinepubs/007904975/functions/pthread_atfork.html )。

來自fork()文檔:

fork() function 因此僅用於運行新程序,並且在調用fork()和調用exec function 之間調用需要某些資源的函數的效果是未定義的。

什么都沒有,除非一個恰好被運行新進程的線程搶占。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM