/*********************************************************************
* Author : Samson
* Date : 05/30/2012
* Test platform:
* GNU Linux version 2.6.29.4
* gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)
* *******************************************************************/
当线程调用fork时,就为子进程创建了整个进程地址空间的副本。若父进程包含多个线程,子进程在fork返回以后,如果紧接着不是马上调用exec的话,就需要清理锁状态。
在子进程内部只存在一个线程,它是由父进程中调用fork的线程的副本构成的。如果父进程中的线程占有锁,子进程同样占有这些锁。问题是子进程并不包含占有锁的线程的副本,所以子进程没有办法知道它占有了哪些锁并且需要释放哪些锁。若子进程从fork返回以后马上调用某个exec函数,就可以避免这样的问题,这种情况下,老的地址空间被丢弃,所以锁的状态无关紧要。但如果子进程需要继续做处理工作的话,这种方法就行不通,还需要使用其他的策略。
要清除锁状态可以通过调用pthread_atfork函数建立fork处理程序。
int pthread_atfork(void (*prepare)(void), void (*parent)(void),
void (*child)(void));