【发布时间】:2013-01-19 05:01:33
【问题描述】:
有了C++11<atomic>规范,有没有新鲜度的保证?不同内存顺序的描述只处理重新排序(据我所知)。
具体来说,在这种情况下:
#include <atomic>
std::atomic<int> cancel_work(0);
// Thread 1 is executing this function
void thread1_func() {
...
while (cancel_work.load(<some memory order>) == 0) {
...do work...
}
}
// Thread 2 executes this function
void thread2_func() {
...
cancel_work.store(1, <some memory order>);
...
}
如果线程 1 和线程 2 不共享除 cancel_work 之外的任何其他数据,那么在我看来,不需要任何排序保证,并且 std::memory_order_relax 对于存储和加载都足够了。但这是否保证线程 1 将永远看到 cancel_work 的更新,而不是重复读取其本地缓存行而不从主内存刷新它?如果没有,做出该保证的最低要求是多少?
【问题讨论】:
-
@UmNyobe 在问我之前我没有找到这个问题的原因是它似乎与挥发物有关。答案是重复的,但问题是 imo 不是因为寻找与您提到的“原子和易失性”问题不同的东西的人会发现这个问题。
标签: c++ multithreading concurrency c++11 atomic