2012-10-13 86 views

回答

4

基本拇指規則,根據像(http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-themfork in multi-threaded program)各種互聯網文章有:

  1. (主)過程[0]單細絲 - >叉() - >(兒童)過程[1]多線程行!
    如果過程[1]崩潰或具有記憶混亂周圍它將過程的不觸摸地址空間[0](除非使用共享R/W存儲器...但這是另一個主題它自己的)。
    在Linux中默認所有fork()ed內存是Copy On Write。鑑於過程[0]是單線程,當我們調用叉()所有可能的互斥原語應通常解鎖狀態。

  2. (主)過程[0]多線程 - >叉() - >(子)過程[1]單聲道/多線程BAD!
    如果叉()一個多線程進程的互斥體和許多其他線程同步原語可能會在一個未定義狀態在過程[1]。你可以用pthread_atfork()解決,但是如果你使用庫,你可能會擲骰子,並希望是幸運的。因爲通常你不會(想要)知道庫的實現細節。

成多線程處理的fork()的的好處是,你可以操控/讀/彙總數據更快(子進程),而不必在意過程的穩定性,你叉() from(Main)。如果你的主進程有一個數據集很多的內存,並且你不想複製/重新加載它來安全地處理另一個進程(Child)中的數據,這很有用。這樣,原始過程是穩定的,並且獨立於數據聚合/操縱過程(fork()ed)。

當然這意味着原始進程一般會比以多線程方式開發時慢。但是,再次,這是您可能想要支付更高穩定性的代價。

如果改爲您的主進程是多線程的,請使用來避免 fork()。這將是一個適當的混亂以穩定的方式實施它。

乾杯

-1

在Linux上,螺紋在流程方面實現。換句話說,線程實際上只是一個主要是共享內存的fork(),而不是完全寫入時複製內存。這意味着,當在線程(主或其他)中使用fork()時,最終會複製所有線程的整個共享內存空間以及您從中調用fork()的線程的線程特定存儲空間。

現在所有這些都聽起來不錯,但這並不意味着這將會發生什麼或者工作得很好。如果您想要創建一個克隆進程,請嘗試在啓動任何其他線程之前執行fork,然後使用只讀虛擬內存來使分叉進程保持最新,並使用當前內存值。

因此,雖然它可能工作,我只是建議測試,並嘗試先找到另一種方法。並進行了大量的準備:

Segmentation fault 
+1

即使使用linux,仍然有線程和進程具有非常不同的語義。特別是在崩潰時,崩潰的線程會把所有其他人都帶走,並且可以處理崩潰的過程。我沒有感覺到你的答案對原始問題特別有用,應該已經發表了評論。 –

+0

@Linuxios感謝關於如何在Linux下創建線程的附加說明,但不應該是技術上使用的_clone()_ call?我認爲整體而言,這有點令人困惑。乾杯 – Emanuele

+0

@Emanuele:這正是我所說的。克隆呼叫。 – Linuxios