2010-10-12 146 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