【发布时间】:2013-09-21 22:40:43
【问题描述】:
C++11 引入了std::atomic<> 模板库。该标准指定store() 和load() 操作以原子方式设置/获取多个线程共享的变量。
我的问题是赋值和访问操作也是原子的吗?
即是:
std::atomic<bool> stop(false);
...
void thread_1_run_until_stopped()
{
if(!stop.load())
/* do stuff */
}
void thread_2_set_stop()
{
stop.store(true);
}
相当于:
void thread_1_run_until_stopped()
{
if(!stop)
/* do stuff */
}
void thread_2_set_stop()
{
stop = true;
}
【问题讨论】:
-
正如 Serge 所说,
stop.load(std::memory_order_relaxed)和stop.store(true, std::memory_order_relaxed);在这里应该没问题。您只需要立即看到商店,relaxed仍然保证这一点。只有在需要同步其他数据时,才需要更强的排序。