多线程程序中,fork易导致死锁

在多线程程序中,使用fork可能导致死锁问题。当父进程在持有锁的情况下创建子进程,子进程会继承锁的状态,从而在尝试获取相同锁时发生死锁。这个问题源于fork只会复制当前线程到子进程,其他线程不会被继承,导致资源状态不一致。示例代码展示了这种情况,其中子进程在父进程的线程睡眠期间尝试获取已被锁定的mutex,导致死锁发生。
摘要由CSDN通过智能技术生成
 fork creates a child process that differs from the parent process only in its PID and PPID, and in the fact that resource utilizations are set to 0. File locks and pending signals are not inherited.

以上来自于man fork的解释。fork创建了一个与父进程的内存完全一致的子进程。即在fork的时刻拷贝了一份内存数据到子进程中。

在 POSIX 标准中,fork 的行为是这样的:复制整个用户空间的数据(通常使用 copy-on-write 的策略,所以可以实现的速度很快)以及所有系统对象, 然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的。
其它线程的突然消失,是一切问题的根源。

这就会导致,父进程在获取到锁的情况下,fork了一个子进程。子进程的内存中,这个锁的状态是上锁状态。
子进程仅运行了fork所在的这个线程,其它线程没有运行,当它尝试获取锁时,就发生了死锁。


以下内容摘自  http://blog.csd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值