多线程与fork()

fork一般不能在多线程程序中调用,因为Linux的fork()只克隆当前线程的thread of control,不克隆其他的线程。fork()之后,除了当前的线程之外,其他的线程都消失。也就是说fork不能一下子得到一个与父进程一样的多线程子进程。

fork()之后,子进程中已有一个线程,其他的线程都消失了,这就造成一个危险的局面。在执行fork前,有一个mutex被线程锁住了,此时调用fork,子进程空间的mutex会处于锁住状态,由于父进程中的mutex与子进程中的muetx属于不同的空间,即使父进程中的mutex别解锁了,此时子进程中的mutex也是处于锁住状态,在子进程中根本就没有谁拥有该锁,这就导致子进程的mutex一直处于锁住状态,此时如果子进程对mutex加锁的话,那么就会进入死锁。