fork()的行为是未定义的。我如何检查只有一个线程(主要在linux上,但是windows,darwin也是有意义的)?
答案 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,那意味着该过程是单线程的。