让我们假设如下:
我在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++编程中不被认为有用