fork与多线程

当一个多线程程序使用fork,子进程会继承父进程的互斥锁状态,可能导致死锁。pthread_atfork可以用于在fork前后清理锁状态,避免这种问题。在多线程环境中,不推荐使用fork,因为可能引发对象析构问题和资源管理混乱。通过使用pthread_atfork,可以在子进程中避免死锁的发生。
摘要由CSDN通过智能技术生成

       如果一个多线程程序调用了fork,那么新创建的子进程只拥有一个执行线程(调用fork的那个线程的完整复制),并且子进程自动继承父进程的互斥锁(条件变量)的状态,即父进程中被加锁的互斥量在子进程中也是被锁住的。于是子进程不知道继承而来的互斥量的具体状态,若互斥量在fork前已经被加锁,子进程若再对互斥量加锁则一定死锁。当然若fork后的子进程立即调用exec()执行其它程序隔断了父子关系则不会出现上述情形。

         pthread_atfork可以清除锁状态,以确保fork调用后父子进程都拥有一个清除的锁状态。 int pthread_atfork(void(*prepare)(void),void(*parent)(void),void(*child)(void));建立三个fork句柄来清理互斥量的状态,prepare句柄在fork系统调用前被执行用来锁住所有父进程中的互斥锁,parent在fork创建子进程后但是在fork返回前在父进程中执行释放所有在prepare被锁住的互斥量,child句柄是在fork返回之前,在子进程中执行,释放所有在prepare句柄中被锁住的互斥锁。多线程调用fork时可以用,若是单线程fork或者exec则没有必要用这个。

         还有就是父进程创建的对象子进程进程了最后对象会被析构两次,则构造和析构就不是成对出现了。如果对象是采用RAII手法封装的某种资源,如定时器子进程不会继承,而RAII对象在子进程的析构可能会试图释放一个不存在的资源。所以多线程中尽量不要fork调用。

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>

pthread_mutex_t mu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值