如果我有使用fork()和可能發展爲多線程應用程序,有什麼拇指規則/指南考慮到安全設定此種類的應用程序?
回答
基本拇指規則,根據像(http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them,fork in multi-threaded program)各種互聯網文章有:
(主)過程[0]單細絲 - >叉() - >(兒童)過程[1]多線程:行!
如果過程[1]崩潰或具有記憶混亂周圍它將過程的不觸摸地址空間[0](除非使用共享R/W存儲器...但這是另一個主題它自己的)。
在Linux中默認所有fork()ed內存是Copy On Write。鑑於過程[0]是單線程,當我們調用叉()所有可能的互斥原語應通常在解鎖狀態。(主)過程[0]多線程 - >叉() - >(子)過程[1]單聲道/多線程:BAD!
如果叉()一個多線程進程的互斥體和許多其他線程同步原語可能會在一個未定義狀態在過程[1]。你可以用pthread_atfork()解決,但是如果你使用庫,你可能會擲骰子,並希望是幸運的。因爲通常你不會(想要)知道庫的實現細節。
成多線程處理的fork()的的好處是,你可以操控/讀/彙總數據更快(子進程),而不必在意過程的穩定性,你叉() from(Main)。如果你的主進程有一個數據集很多的內存,並且你不想複製/重新加載它來安全地處理另一個進程(Child)中的數據,這很有用。這樣,原始過程是穩定的,並且獨立於數據聚合/操縱過程(fork()ed)。
當然這意味着原始進程一般會比以多線程方式開發時慢。但是,再次,這是您可能想要支付更高穩定性的代價。
如果改爲您的主進程是多線程的,請使用來避免 fork()。這將是一個適當的混亂以穩定的方式實施它。
乾杯
在Linux上,螺紋在流程方面實現。換句話說,線程實際上只是一個主要是共享內存的fork()
,而不是完全寫入時複製內存。這意味着,當在線程(主或其他)中使用fork()
時,最終會複製所有線程的整個共享內存空間以及您從中調用fork()
的線程的線程特定存儲空間。
現在所有這些都聽起來不錯,但這並不意味着這將會發生什麼或者工作得很好。如果您想要創建一個克隆進程,請嘗試在啓動任何其他線程之前執行fork,然後使用只讀虛擬內存來使分叉進程保持最新,並使用當前內存值。
因此,雖然它可能工作,我只是建議測試,並嘗試先找到另一種方法。並進行了大量的準備:
Segmentation fault
- 1. 我應該如何在Qt中處理這個線程問題?
- 2. 我應該如何處理Java中的多線程?
- 3. 我應該如何(應該)向服務中的線程添加處理程序
- 4. 我該如何處理UIActionSheet和Three20?
- 5. (StaleElementException:Selenium)我該如何處理?
- 6. 我該如何處理「CrossThreadMessagingException」?
- 7. NullReferenceException,我該如何處理?
- 8. fork和現有線程?
- 9. Boost,異常,線程和異步,我應該如何處理它們?
- 10. 如何處理線程和領域? (iOS)
- 11. 如何在線程中處理線程?
- 12. python線程/ fork?
- 13. 如何處理線程
- 14. 如何處理線程?
- 15. 如何處理線程C#
- 16. 如何處理java線程
- 17. Java:ThreadFactory如何處理線程?
- 18. 線程如何處理?
- 19. 了JavaFx任務事件處理程序中處理該線程
- 20. 我該如何處理我的servlet
- 21. 我應該如何處理我的pg_log?
- 22. Boost :: Thread或fork():多線程HTTP代理
- 23. fork + exec無atfork處理程序
- 24. 我應該如何處理水線和藍鳥的承諾和回調?
- 25. 誰應該在MVC中處理線程?
- 26. 線程和異常處理
- 27. 活動和線程處理
- 28. Swing和處理線程
- 29. Perl fork fork線程捕獲輸出
- 30. 線程處理
@JensGustedt我本來也這樣想太多,但這應該沿着約線程和_fork()_在Linux上的綜合性問題的線條也比較多。 – Emanuele