让我们假设如下:
我在 Linux / Mac OS 上有两个进程。
I have 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-易失性-使用-with-易失性_负载和-易失性_store/ https://embeddedartistry.com/blog/2019/03/11/improve-volatile-usage-with-volatile_load-and-volatile_store/
Note:
这不安全std::atomic<>
,因为它不“承诺”任何有关共享内存的信息。此外,从两个不同的过程构建/销毁根本不清楚。
这会是线程/进程间安全的吗?
No.
来自您自己的链接 https://embeddedartistry.com/blog/2019/03/11/improve-volatile-usage-with-volatile_load-and-volatile_store/:
一个有问题且常见的假设是,挥发性等同于“原子”。不是这种情况。挥发性关键字仅表示该变量可以在外部修改,因此无法优化读/写。
您的代码需要atomic访问该值。if (data->reload == 1)
如果它从中读取一些部分/中间值,则将不起作用data->reload
.
不用担心如果多个线程会发生什么do read 1
from data->reload
- 您发布的代码根本无法处理该问题。
另请参阅为什么 volatile 在多线程 C 或 C++ 编程中没有被认为有用? https://stackoverflow.com/questions/2484980/why-is-volatile-not-considered-useful-in-multithreaded-c-or-c-programming
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)