分叉后穿线是否安全?

Olf*_*fan 9 unix linux perl multithreading fork

我已经知道你应该坚持使用分叉或线程来避免遇到非常奇怪且极难调试的问题,所以直到现在我总是这样做.我的问题是,当我坚持只分叉,创造许多分配大量工作的短期流程随着我想要提供的CPU核心越来越多而变得越来越昂贵,直到某些时候性能不再合理地扩展.同时,只使用线程我必须非常小心我使用哪些库,并且通常在线程安全方面非常防御,这占用了大量宝贵的开发时间并强制放弃一些喜欢的库.因此,即使我被警告​​,混合分叉和穿线的想法确实在很多层面上吸引我.

现在,根据我到目前为止所读到的内容,当fork发生时已经创建了线程时,似乎总会出现问题.

鉴于我设计的系统可以启动,守护,分叉其主要层级,并且在我完全安全和强大之后永远不会再进行任何分叉.如果其中一些预分叉层现在开始使用线程将工作负载分配到许多CPU内核上,以便各种子进程永远不会知道其他子进程的thrads,那么这仍然是安全的吗?我可以确保每个层本身都是线程安全的,并且非线程安全层不会启动自己的线程.

虽然我对这种方法感到非常安全,但我很欣赏一些关于此事的专业意见,指出各种可能的警告,有趣的观点,高级阅读的链接等.我个人使用的语言是Debian上的Perl, RedHat,SuSe和OS X,但主题足够通用,以便对任何类似Un*x/BSD的平台上的任何语言都有效,这些平台可以表现为远程POSIXish,甚至可能是Interix.

S.L*_*ott 8

创建许多短期流程来分配大量工作,以便在我想要提供更多CPU核心的情况下获得更高成本

并不是的.

但是,您可以使用消息队列而不是为每个工作分配单独的进程.

创建一堆所有从公共队列中读取的进程.将他们的工作放入队列.不再分叉了.许多小任务来自公共队列.

和.没有线程安全问题.


caf*_*caf 4

只要您不创建MAP_SHARED在分叉进程之间共享的任何共享内存区域,您的方法在 POSIX 下就很好。一旦进程被分叉,它们就是独立的。

请参阅POSIX 文档fork()