线程和fork

一、简介

    当线程调用fork时,就为子进程创建了整个进程地址空间的副本,父子进程通过写时复制技术来共享内存页的这一副本。

    子进程通过几成整个地址空间的副本,也从父进程那里继承了所有互斥量、读写锁和条件变量的状态。如果父进程包含多个线程,子进程在fork返回后,如果紧接着不是马上调用exec的话,就需要清理锁状态。

    在子进程内部只存在一个线程,它是由父进程中调用fork的线程的副本构成的。如果父进程中线程占用锁,子进程同样占用这些锁。问题就是子进程并不包含占用锁的线程的副本,所以子进程没办法知道它占用了哪些锁并需要释放哪些锁。

   1、在子进程从fork返回后立马调用exec函数,可以避免这个问题。这种情况下,老的地址空间被丢弃,所以锁的状态无关紧要了。但如果子进程需要继续做处理工作的话,这种方法就行不通了,所以还需要其他策略。

   2、另一种方法就是通过调用pthread_atfork函数建立fork处理程序。其原型如下:

#include <pthread.h>

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
    这一函数的作用是为fork安装三个帮助清理锁的函数。其中:

    prepare函数由父进程在fork创建子进程之前调用,这个fork处理程序的任务是获取父进程定义的所有锁;

    parent函数在fork创建子进程后,但在fork返回之前在父进程环境中调用的,其任务是对prepare获取的所有锁进行解锁;

    child函数是在fo

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值