分叉后穿线是否安全?

时间:2010-09-16 10:26:27

标签: linux multithreading perl unix fork

我了解到你通常应该坚持使用分叉或线程来避免遇到非常奇怪且极难调试的问题,所以直到现在我总是那样做。我的问题在于,当我坚持只使用分叉时,创建许多短暂的进程来分配大量的工作,以便在我想要提供更多CPU核心的情况下获得更高的成本,直到某些点性能不再合理地扩展。同时,只使用线程我必须非常小心我使用哪些库,并且通常在线程安全方面非常防御,这占用了大量宝贵的开发时间并强制放弃一些喜欢的库。所以,即使我被警告​​过,混合分叉和穿线的想法确实在很多层面上吸引我。

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

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

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

2 个答案:

答案 0 :(得分:8)

  

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

不是。

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

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

和。没有线程安全问题。

答案 1 :(得分:4)

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

请参阅POSIX documentation on fork()