我们说我有一个班级......
class foo {
public:
int i;
foo(int j) { i = j; }
};
然后,我在这样的代码中使用它:
foo *bar = new foo(17);
cout << "Bar is " << bar->i << endl;
if (!fork()) {
bar->i = 2;
exit(0);
}
cout << "Bar is now " << bar->i << endl;
我用g++
编译它并运行可执行文件。我得到以下输出:
me@computer:~$ ./a.out
Bar is 17
Bar is now 17
我有一个类似的问题,我需要一个指向if (!fork())
块内修改的类(比示例稍微复杂一点)的指针。有没有办法做到这一点?
我可以将此类转换为字符串,如果这样可以更容易。我正在使用C ++ 11和cmake
,如果这是相关的。
更新:线程正在为我创造奇迹。谢谢大家。这就是我所做的,基本上:
void blob(foo *bar)
{
bar->i = 2;
}
int main()
{
foo *bar = new foo(17);
thread th (blob,bar);
th.detach();
delete bar;
return 0;
}
答案 0 :(得分:1)
一旦你做了fork,就会产生一个完全不同的进程,它有一个完全独立的(但最初是重复的)内存。无论你修改什么,都不会在主进程中反映出来,反之亦然(在fork之后)。
您需要使用线程。
答案 1 :(得分:0)
一旦你分叉,新的子进程就有一个独立的地址空间。父级中的任何更改对于子级都是不可见的,并且子级中的任何更改对父级都是不可见的。现在,在幕后,大多数fork实现都使用copy-on-write,这样只要父或子开始写入它就会复制一页物理RAM,但这一切都隐藏在用户进程中。
您需要使用线程或某种interprocess communication。有很多方法可以做到这一点,都有自己的权衡。