【发布时间】:2021-07-04 18:23:01
【问题描述】:
假设我有一个迈耶斯单身
Data& get() {
static Data data = initialization_work();
return data;
}
已在父进程中使用和初始化。然后我 fork(2) 一个子进程,并且在子进程中 data 可能需要不同(即,我希望 initialization_work() 在子进程中第一次调用 get() 时重新运行)。
首先,data 会在分叉的孩子中自动重新初始化吗?我的怀疑是否定的,基于我对 linux 的平庸知识(分叉的子 VA 空间是映射到物理内存写入时复制的父级的副本,所以我假设子进程将看到 data 已经初始化并且不会重做initialization_work()) 和其他几个问题 (C static variables and linux fork,
C++ static variable and multiple processes)。
其次,如果data不会默认在child中重新初始化,有没有办法在child第一次调用get()时强制重新初始化?如果没有,我可以尝试找出一些其他模式(我非常感谢任何关于哪种模式可能适合这个用例的建议)。
【问题讨论】:
-
@MartinYork: 1. 进程 ID 不同 :-P 2. 问题仍然存在,即使是关于原始进程...
-
我在我应该之前回答了(所以我删除了它)。您是否想要它重新初始化,即使您得到@MartinYork 提到的(几乎)完全相同的副本?
-
如果 pid 更改重置
data的值,您可以将当前的pid保存在get()中?