fork with thread

[url]http://gceclub.sun.com.cn/solaris/819-7051-10.pdf[/url]

Fork-One 安全问题和解决方案
除了通常关注的问题(如锁定共享数据)以外,当只有fork() 线程处于运行状态时,还应
根据fork 子进程的操作来处理库。问题在于子进程中的唯一线程可能会尝试获取由未复制
到子进程中的线程持有的锁定。
大多数程序不可能遇到此问题。从fork() 返回后,大多数程序都会调用子进程中的
exec()。但是,如果程序在调用exec() 之前必须在子进程中执行操作,或永远不会调用
exec(),则子进程可能会遇到死锁。每个库编写者都应提供安全的解决方案,尽管提供一
个非fork 安全的库不是一个很大的问题。
例如,假设当T2 fork 新进程时,T1 在进行打印,且对printf() 持有锁定。在子进程中,
如果唯一的线程(T2) 调用printf(),则T2 将快速死锁。
POSIX fork() 或Solaris fork1() 函数仅复制用于调用fork() 或fork1() 的线程。如果调用
Solaris forkall() 来复制所有线程,则此问题不是要关注的问题。
但是,forkall() 可能会导致其他问题,使用时应小心。例如,如果一个线程调用
forkall(),则将在子进程中复制对文件执行I/O 的父线程。线程的两个副本都将继续对同
一个文件执行I/O,一个副本在父进程中,一个副本在子进程中,这将导致出现异常或文件
损坏。
要防止在调用fork1() 时出现死锁,请确保在执行fork 时任何锁定都未被持有。防止死锁的
最有效的方式就是让fork 线程获取可能由子进程使用的所有锁定。由于无法获取对
printf() 的所有锁定(由于printf() 由libc 所有),因此必须确保在使用fork() 时没有使
用printf()。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值