为什么Glib fork / exec进程可以使用线程?

时间:2018-05-22 04:15:24

标签: process pthreads fork glib

以下对于pthread用户来说非常糟糕,包括我:

然而,Glib文档说它可以在启用pthread的情况下fork / exec:

为什么/ Glib如何做到这一点?

1 个答案:

答案 0 :(得分:2)

你可以从pthread中fork(),但是正确地完成细节可能很棘手。例如,分叉进程内存将包含原始进程中所有条件变量和互斥锁的副本。这是一个相关的问题,以及有关如何例如干净地释放各种线程持有的所有互斥锁。

fork in a multithreaded process with lots of state held in threads

请注意,一般的想法是fork(),做一些清理,然后是exec()。

有关可在fork和exec之间调用的异步信号安全函数的列表,请参阅this manpage (signal-safety(7))

但我的一般建议是让您的线程应用程序更简单 - 在varioius线程中处理大量状态的问题就是要求麻烦。例如,exec()按设计保留打开的文件描述符,因此如果任何线程有一个打开的文件描述符,exec():ed进程可能会不必要地携带该描述符。资源泄漏是代码气味,通常是草率设计的标志。如果可以,请使用RAII。