c++ - fork 后全局资源的归属

标签 c++ fork ownership-semantics

考虑一个 Foo拥有一些资源

struct Foo
    {
    ~Foo();
    };

和全局std::vector<Foo> .也许是愚蠢的例子,但它很好地说明了问题。

std::vector<Foo> bar;

现在,进程 fork

如果bar然后仅由子进程修改,然后调用 exit应该是在子进程中做的正确事情。如果调用 _exit , 任何 Foo :s 在酒吧会泄漏。如果 parent 向 bar 添加了一些东西在 fork 之前,这些对象可能会被销毁两次。或者这可能不是问题,因为它们应该被视为不同的对象。

将对象生命周期与 fork 一起处理的正确方法是什么? .让 child 处理这个问题是唯一理智的方法exec重新开始?

我应该注意到,在程序的这一点上,保证只有一个线程。

最佳答案

What is the proper way of dealing with object lifetime together with a fork?

fork 时处理共享资源的正确方法取决于这些对象或资源是什么。

对于进程内存中的任何对象或变量,你automatically get a copy它在 fork 时。然后每个进程将能够修改或销毁任何变量而不影响其他进程。这也意味着每个进程负责清理其唯一的资源拷贝。


对于存在于进程之外的其他资源,如文件、网络套接字或共享内存;处理它们的最佳方法将取决于该资源是什么。通常,这些最佳实践将由您最初用于创建这些资源的库/API 概述。

关于c++ - fork 后全局资源的归属,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417618/

相关文章:

c++ - 为什么有些人在 C++ 程序的开头放一个空白的#include?

c++ - 将指针转换为 int 实际上会以字节或其他形式返回它的位置吗?

azure - 如何在 Azure DevOps 中查找存储库的分支

rust - 返回对具有泛型 Fn 特征/值的泛型类型的引用

c++ - 枚举的段错误

C++ 调试窗口显示“<incomplete type> for string variable

perl - Parallel::ForkManager() 模块是否支持全局变量同步?

c - c中的叉树取决于特定参数

qt - QAction 的所有权

pointers - 取消引用指向 String 的原始指针和指向 i32 的原始指针之间有什么区别?