检查fork()是否安全

时间:2010-12-06 16:56:40

标签: linux multithreading pthreads

如果进程中有多个线程,那么

fork()的行为是未定义的。我如何检查只有一个线程(主要在linux上,但是windows,darwin也是有意义的)?

2 个答案:

答案 0 :(得分:2)

这是不可能的。使用pthread可以使用pthread_is_multithreaded_np()函数,但它会使您的fork()代码依赖于pthread,并且它不适用于所有平台。无论线程库如何,都无法进行检查。

如果这是一个应用程序,请不要同时使用线程和fork。如果您正在制作线程程序,请不要调用fork()(fork / execv组合除外)。

如果这是一个库,请不要在其中使用fork(),或要求该库永远不会与线程应用程序一起使用。

或者对于某个应用,您可以尝试使用pthread_atfork(...)来确保调用fork()是安全的。

答案 1 :(得分:2)

在Linux下,fork()的行为在多线程进程中没有未定义,但它做的事情通常不是很有用。

或者更确切地说,如果你fork()并且不立即调用exec(),则可能会泄漏未指定的资源,可能包括可能导致死锁的锁。

当然可以向Linux(通过procfs)询问当前线程组中有多少个线程。如果答案是1,那意味着该过程是单线程的。