思考一下这样的一个问题:
如果一个多线程程序的某个线程调用了fork()函数,那么新创建的子进程是否将自动创建和父进程相同数量的线程呢?
答案是否定的,正确解释是子进程只拥有一个执行线程,他是调用fork()的那个线程的完整复制。并且子进程将自动继承父进程中的互斥锁(条件变量与之类似)的状态。可以说,父进程中被加锁的互斥锁在子进程中也是被锁住的。
但同时又引出了新的问题,作为fork()过来的子进程,他从父进程中继承过来的互斥锁的状态是lock还是unlock?这样的话对子进程如果对该锁进行lock操作就会导致死锁。
聪明的开发人员肯定有未雨绸缪的手段,pthread专门提供了一个叫atfork()的函数,专门用来解决此问题!
#include <pthread.h>
int pthread_atfork( void (*pthread){void}, void(*parent){void}, void(*child){void} );
**该函数的作用用来确保fork()调用之后父进程和子进程都拥有一个清楚的锁状态。**解释如下图:
函数展示:
void prepare()
{
pthread_mutex_lock(&mutex);
}
void infork()
{
pthread_mutex_unlock(&mutex);
}
pthread_atfork(prepare, infork, infork);