使用 Fork-One 模型时,请使用 pthread_atfork() 来防止死锁。
#include <pthread.h> int pthread_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void) );
pthread_atfork() 函数声明了在调用 fork() 的线程的上下文中的 fork() 前后调用的 fork() 处理程序。
在 fork() 启动前调用 prepare 处理程序。
在父进程中返回 fork() 后调用 parent 处理程序。
在子进程中返回 fork() 后调用 child 处理程序。
可以将任何处理程序参数都设置为 NULL。对 pthread_atfork() 进行连续调用的顺序非常重要。
例如,prepare 处理程序可能会获取所有需要的互斥。然后,parent 和 child 处理程序可能会释放互斥。获取所有需要的互斥的 prepare 处理程序可确保在对进程执行 fork 之前,所有相关的锁定都由调用 fork 函数的线程持有。此技术可防止子进程中出现死锁。