【发布时间】:2020-03-04 11:55:41
【问题描述】:
我有一个初始值为 42 的int32_t。现在我希望它可以被多个线程原子地访问。
#include <atomic>
using namespace std;
int32_t* pn{};
int main()
{
pn = getPtrFromMmap();
assert(42 == *pn); // note that *pn is mapped to a disk file
// How to make the following two threads access *pn atomically?
std::thread{[&]{ (*pn)++; }}.detach();
std::thread{[&]{ (*pn)++; }}.detach();
}
编写一个正确的原子操作类并非易事。所以,我尝试使用std::atomic 来实现我的目标,但失败了。
有没有办法在这种情况下重用std::atomic?
【问题讨论】:
-
不使用
std::atomic,为什么不简单地使用其他线程同步原语,比如互斥锁和锁? -
如果您 100% 确定变量不会被外力改变,只需将其复制到原子中,并在一切完成后复制回来。否则,你已经有竞态条件了,所以你需要更新底层代码
-
@Someprogrammerdude,
std::atomic比std::mutex性能更高。 -
@JVApen,copy-write-restore是不行的,因为内存地址映射到一个磁盘文件,也就是pagecache中。即使进程崩溃,pagecache中的数据也可以;而在这种情况下,变量中的副本将丢失。
-
所以你想要一个对易失整数的原子引用?
标签: c++ multithreading c++11 mutex atomic