多线程下子进程继承父进程锁时应如何处理?atfork()函数的作用

思考一下这样的一个问题:

如果一个多线程程序的某个线程调用了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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值