分叉之后,全局变量是否共享?
- 2024-10-21 09:14:00
- admin 原创
- 98
问题描述:
考虑这个简单的代码:
int myvar = 0;
int main() {
if (fork()>0) {
myvar++;
} else {
// father do nothing
}
}
当子线程增加 myvar 时,该值是否与父线程共享(类似 pthread)?
解决方案 1:
不是,也是。
不,它们不以任何程序员可见的方式共享;进程可以独立地修改它们自己的变量副本,并且这些变量的改变不会对其他进程(即 fork() 的父进程、兄弟进程或后代进程)产生任何明显的影响。
但是,是的,操作系统实际上最初确实共享了这些页面,因为 fork 实现了写时复制,这意味着只要没有任何进程修改这些页面,它们就是共享的。然而,这是一个可以忽略的优化。
如果您想要共享变量,请将它们放在匿名共享映射中(参见 mmap()),在这种情况下,它们实际上会被共享,但会带来所有随之而来的警告。
解决方案 2:
fork()
在 fork 时会创建父进程的精确副本。但是,在fork()
完成后,子进程将完全不同,并且不会向父进程汇报。
换句话说,父级的全局变量不会因为子级的变化而改变。
解决方案 3:
在 fork() 之后,整个进程(包括所有全局变量)都会被复制。子进程是父进程的精确副本,只是它具有不同的 PID(进程 ID)、不同的父进程,并且 fork() 返回 0。全局变量在其自己的进程内仍然是全局的。所以答案是否定的,调用 fork() 之后,全局变量不会在进程之间共享。
解决方案 4:
不可以,因为除非实现某种 IPC 机制,否则全局变量不会在进程之间共享。内存空间将被复制。因此,两个进程中的全局变量在 fork 之后将立即具有相同的值,但如果一个进程更改了它,另一个进程将看不到它的变化。
另一方面,线程确实共享全局变量。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD