谨防fork与锁之间的深坑

在fork之后,子进程只保留调用fork的线程,其他线程在子进程中消失,但锁会被继承,可能导致死锁。文章通过例子解释了这一现象,并介绍了`prctl(PR_SET_PDEATHSIG)`函数在解决锁问题上的作用,但其并非万能,可能存在性能和复杂同步对象的问题。解决方案包括子进程立即调用`exec`系列函数,以及处理文件描述符的状态。
摘要由CSDN通过智能技术生成

fork之后应当谨慎使用锁:

这是因为fork有一个特点,那就是子进程只会保留调用fork的那个线程,父进程中其他的线程在子进程中都会消失。但是fork之后,除了文件锁以外,其他的锁都会被继承。这就导致了,如果在子进程中,对某个已经在父进程中加了锁的锁继续加锁,就会导致死锁发生。并且我们无法对该锁进行解锁,因为在子进程中,该锁的持有者并不存在。
下面给一个例子:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
void thread_func(void *arg)
{
    pthread_mutex_init(&mutex, &attr);
    pthread_mutex_lock(&mutex);
    sleep(10);
}
int main()
{
    pthread_t tid;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值