gpt4 book ai didi

c++ - 在共享内存上使用 volatile 安全吗?

转载 作者:行者123 更新时间:2023-12-05 01:50:04 25 4
gpt4 key购买 nike

让我们假设如下:

我在 Linux/Mac OS 上有两个进程。

我有mmap在共享内存中(或在文件中)。

然后在这两个过程中我都有以下内容:

struct Data{
volatile int reload = 0; // using int because is more standard
// more things in the future...
};
void *mmap_memory = mmap(...);
Data *data = static_cast<Data *>(mmap_memory); // suppose size is sufficient and all OK

然后在我做的其中一个过程中:

//...
data->reload = 1;
//...

在另一个方面,我这样做:

while(...){
do_some_work();
//...
if (data->reload == 1)
do_reload();
}

这会是线程/进程间安全的吗?

想法来自这里:
https://embeddedartistry.com/blog/2019/03/11/improve-volatile-usage-with-volatile_load-and-volatile_store/

注意:
这对 std::atomic<> 不安全,因为它不“ promise ”任何有关共享内存的信息。从两个不同的进程构建/破坏也一点都不清楚。

最佳答案

Will this be thread / inter process safe?

没有。

From your own link :

One problematic and common assumption is that volatile is equivalent to “atomic”. This is not the case. All the volatile keyword denotes is that the variable may be modified externally, and thus reads/writes cannot be optimized.

您的代码需要原子 访问该值。 if (data->reload == 1) 如果它从 data->reload 读取一些部分/中间值,则将不起作用。

并且不要介意如果多个线程data->reload读取1会发生什么——你发布的代码根本不处理这个.

另见 Why is volatile not considered useful in multithreaded C or C++ programming?

关于c++ - 在共享内存上使用 volatile 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73472396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com