2010-10-12 147 views
10

由於C#支持線程,有什麼方法可以在C#中實現叉子概念嗎?C中的叉子概念#

在此先感謝....

+0

就像在UNIX命令fork?在那種情況下,沒有。 – 2010-10-12 09:21:34

回答

18

這更是一個比C#.NET/CLR的事情。通常,這是底層操作系統的問題。 Windows不支持產生新進程的類似於語義的fork()。另外,fork()與多線程支持無關。

fork()的語義涉及複製原始進程的地址空間的內容。我的觀點是這是一個過時的過程創建方法,在Windows世界中幾乎沒有任何空間,因爲它涉及到很多安全和操作系統架構問題。

從.NET的角度來看,fork()的基本問題將是複製和/或共享非託管資源(文件句柄,同步對象,窗口句柄(!)等)新的過程。我認爲沒有理由將這種概念引入.NET或底層的Windows操作系統。

有關進一步討論,請參見saurabh的鏈接。

+0

我能想到的一個嚴重的原因是處理死鎖(線程分叉)。這是一個先進的想法。但是,推送和彈出線程狀態(分叉和休眠新線程)以及被鎖定對象的版本控制可能允許您在死鎖可能出現之前彈出。 (注意:死鎖可以防止數據損壞......你可以讓它們都去,但數據不會獨佔鎖定 - 即使一次只運行一個線程)。這給了我們非死鎖的原子對象(甚至數據庫死鎖)。這是一個嚴重的原因。 – TamusJRoyce 2012-08-04 05:02:54

+0

請注意,'fork'實際上不會在.NET上提供任何所需的效果。 'fork'在多線程應用程序中運行不好,它會導致所有其他線程被終止。由於至少有一個GC線程正在運行,因此每個定義的.NET應用程序都是多線程的。 – Sebazzz 2017-09-13 12:25:00