我必须明确调用原子加载/存储吗?

时间:2013-09-17 13:07:44

标签: c++ c++11 atomic

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;
}

2 个答案:

答案 0 :(得分:33)

  

非引用类型的赋值和访问操作是否也是原子的?

是的,他们是。 atomic<T>::operator Tatomic<T>::operator=分别相当于atomic<T>::loadatomic<T>::store。所有运算符都在原子类中实现,以便它们可以像您期望的那样使用原子操作。

我不确定你对“非参考”类型的意思是什么?不确定参考类型的相关性。

答案 1 :(得分:13)

您可以同时执行这两项操作,但load() / store()的优点是它们允许指定内存顺序。有时候,性能很重要,您可以指定std::memory_order_relaxedatomic<T>::operator Tatomic<T>::operator=会使用最安全和最慢的std::memory_order_seq_cst。有时候对代码的正确性和可读性很重要:虽然默认std::memory_order_seq_cst最安全,因此最有可能是正确的,但是对于读者来说,并不是很清楚你有什么样的操作(获取/释放/消费)正在做什么,或者你是否正在进行这样的操作(回答:这里的宽松订单是否足够?)。