博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谨慎使用多线程中的fork
阅读量:5174 次
发布时间:2019-06-13

本文共 921 字,大约阅读时间需要 3 分钟。

// Upon successful completion, pthread_atfork() shall return a value of zero; otherwise, an error number shall be returned to indicate the error.
// @prepare 新进程产生之前被调用
// @parent  新进程产生之后在父进程被调用
// @child    新进程产生之后,在子进程被调用
int pthread_atfork (void (*prepare) (void), void (*parent) (void), void (*child) (void));

 

多进程的多线程程序,听起来多不靠谱。真是闲得淡疼的人才会做此设计。但依旧可以使用万能的推辞:历史造成的。

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

其它线程的突然消失,是一切问题的根源。

我之前从未写过多进程多线程程序,不过公司里有 David Xu 同学(他实现维护着 FreeBSD 的线程库)是这方面的专家,今天跟徐同学讨论了一下午,终于觉得自己搞明白了其中的纠结。嗯,写点东西整理一下思路。

可能产生的最严重的问题是锁的问题。

因为为了性能,大部分系统的锁是实现在用户空间的。所以锁对象会因为 fork 复制到子进程中。

对于锁来说,从 OS 看,每个锁有一个所有者,即最后一次 lock 它的线程。

假设这么一个环境,在 fork 之前,有一个子线程 lock 了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。

当子进程想 lock 这个锁时,不再有任何手段可以解开了。程序发生死锁。

转载于:https://www.cnblogs.com/c-slmax/p/5544766.html

你可能感兴趣的文章
nginx负载均衡
查看>>
弹出遮罩层后禁止滚动效果
查看>>
DOCTYPE声明对JS获取窗口宽度和高度的影响【转】
查看>>
使用表达式避免拼接SQL语句
查看>>
Leetcode152. Maximum Product Subarray乘积的最大子序列
查看>>
Leetcode598.Range Addition II范围求和2
查看>>
Leetcode617.Merge Two Binary Trees合并二叉树
查看>>
jquery选择div下的ul下的li下的a
查看>>
lock的两种方式
查看>>
YCSB-mapkeeper
查看>>
Python 经典正则表达式语法实例
查看>>
oracle函数 MAX([distinct|all]x)
查看>>
LINUX对于未安装的软件包的查看
查看>>
判断iOS设备是否越狱
查看>>
团队博客
查看>>
hdoj--1010<dfs+奇偶剪枝>
查看>>
在Android中如何获取视频的第一帧图片并显示在一个ImageView中
查看>>
深入理解CNI
查看>>
Pie(二分法)
查看>>
为单元测试等非WebBase的项目伪造一个HttpContext , Session 和HttpHeader
查看>>