在多线程中fork时的问题

假设现在有一个进程A,它有三个线程,如下:
在多线程中fork时的问题
现在在线程1中fork,操作系统只会复制线程1,而线程2,线程3都会被抛弃而消失,
在进程A中的线程1 fork()后产生的进程B,如下:
在多线程中fork时的问题
可以看到在fork之后,线程2,线程3都消失了,只有线程1,这就存在问题了。
加入在进程A的线程1 fork之前,有一个锁,被线程2持有,然后fork之后,线程2又消失了,相当与这个锁被一直持有了,如果这个时候,进程B的线程1也想持有该锁,这个时候,就会引起死锁。
而在linux编程中,malloc这个函数在运行时会加锁,printf也会锁住stdout,stderr,还有很多函数在实现时会加锁。
所以,多线程后fork极其不安全。
所以建议如果一定要多线程后fork,建议fork之后用execv替换为新的程序。