64

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

2 回答 2

55

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

对,他们是。 atomic<T>::operator Tatomic<T>::operator=分别等价于atomic<T>::loadatomic<T>::store。所有运算符都在原子类中实现,因此它们将按照您的预期使用原子操作。

我不确定您对“非参考”类型的含义是什么?不确定引用类型在此处的相关性。

于 2013-09-17T13:35:17.137 回答
31

您可以两者都做,但load()/的优点store()是它们允许指定内存顺序。有时对性能很重要,您可以在其中指定std::memory_order_relaxedwhileatomic<T>::operator T并且atomic<T>::operator=会使用最安全和最慢的std::memory_order_seq_cst. 有时它对代码的正确性和可读性很重要:尽管默认值std::memory_order_seq_cst是最安全的,因此最有可能是正确的,但读者并不能立即清楚您正在执行哪种操作(获取/释放/使用),或者是否你根本就在做这样的操作(回答:这里的放松顺序还不够吗?)。

于 2017-05-31T14:54:18.550 回答