【问题标题】:Can I use C++20 `std::atomic<T>::wait()` or `std::atomic_flag::wait()` in shared memory?我可以在共享内存中使用 C++20 `std::atomic<T>::wait()` 或 `std::atomic_flag::wait()` 吗?
【发布时间】:2022-09-24 10:15:32
【问题描述】:

我的项目涉及一个插件,以及一个用于所述插件的 GUI,该插件被隔离到一个单独的进程中。我共享的数据可能会被 GUI 更新,当它更新时,它应该由插件处理。

为此,我正在考虑将其放入我的共享内存块中:

std::atomic_bool event_flag;
// insert mutex...
some_data_struct data;

本质上,当 GUI 想要更改数据时,它会执行以下操作:

// acquire mutex

// write data...

// release mutex

event_flag = true;
event_flag.notify_one();

然后插件执行以下操作:

event_flag.wait(true);
event_flag = false;

// acquire mutex

// read data...

// release mutex
  • 您将如何在共享内存中创建对象以使它们在两个进程中都有效?我想到了新的放置,但我不知道如果两个进程在同一个内存块上尝试这个会发生什么。如果原子是\"隐式生命周期类型\"en.cppreference.com/w/cpp/named_req/ImplicitLifetimeType

标签: c++ synchronization


【解决方案1】:

C++ 标准从未指定 C++ 代码如何与共享内存和进程交互,其中大部分是实现定义的。

但是,似乎实现不是跨进程的:

  • libstdc++ 似乎在表格中使用 futexes 和/或条件变量。条件变量可能不会跨进程共享,但我没有费心去检查。
  • Microsoft's STL 使用 futexes,它不能跨进程工作。
  • libc++ 可能类似,我没有费心检查。

有一个proposal for process management,但这并没有走得太远,因为 C++ 标准没有“进程”的概念。

如果最终指定了这种行为,我将编辑此答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2018-11-22
    • 2022-01-15
    • 2022-01-10
    相关资源
    最近更新 更多