【发布时间】:2015-09-16 06:46:15
【问题描述】:
我想我主要了解 C++ 原子库中各种 memory_order 标志的语义。
但是,我对以下情况感到困惑:
假设我们有两个线程 - 线程 A 是“主执行”线程,线程 B 是线程池中的任意线程,可以在其中调度和运行任务。
如果我使用std::memory_order_acq_rel 执行“读-写-更新”原子操作,然后在布尔变量上执行非原子写入,则 非原子 em> 写立即对其他线程可见?我认为答案是否定的,除非其他线程也访问执行“读写更新”操作的 atomic 变量。
因此,例如,给定一个全局 std::atomic_flag 变量 X、一个全局 bool 值 B,以及一个线程池对象 THREADPOOL,它有一个成员函数 dispatch,它将执行任意函数处理程序在另一个线程中:
if (!X.test_and_set(std::memory_order_acq_rel)
{
if (SOME_CONDITION) B = true;
THREADPOOL.dispatch([]() {
// This executes in Thread B
if (B) { /* do something */ } // are we guaranteed to see changes to B?
});
}
所以在本例中,lambda 函数内的代码将在不同的线程中执行。该线程是否一定会在第一个线程中看到对B 的(非原子)更新?请注意,第二个线程不访问 atomic_flag,所以我的理解是,对B 的更改将不一定会在第二个线程中看到。
我的理解正确吗?如果是这样,使用std::memory_order_seq_cst 会改变吗?
【问题讨论】:
标签: c++ multithreading c++11 atomic