在共享内存上使用volatile安全吗



让我们假设如下:

我在Linux/Mac操作系统上有两个进程。

我在共享内存(或文件中(上有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<>来说是不安全的,因为它不会"承诺;任何关于共享内存的东西。另外,从两个不同的过程构建/破坏也不清楚。

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

否。

从您自己的链接:

一个有问题且常见的假设是volatile等价于"原子"。事实并非如此。volatile关键字所表示的只是变量可能会被外部修改,因此读/写无法优化。

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

不要介意如果多个线程data->reload读取1会发生什么——您发布的代码根本无法处理这一点。

另请参阅为什么volatile在多线程C或C++编程中不被认为有用

相关内容

  • 没有找到相关文章

最新更新