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

bav*_*aza 41 c++ atomic c++11

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);
}
Run Code Online (Sandbox Code Playgroud)

相当于:

void thread_1_run_until_stopped()
{
    if(!stop)
        /* do stuff */
}

void thread_2_set_stop()
{        
    stop = true;
}
Run Code Online (Sandbox Code Playgroud)

And*_*zos 34

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

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

我不确定你对"非参考"类型的意思是什么?不确定参考类型在这里是如何相关的.

  • 相当于没有一致性控制参数的加载和存储版本,即. (8认同)
  • @BenVoigt,这意味着使用最严格的内存顺序:`std::memory_order_seq_cst`。这可以防止人们搬起石头砸自己的脚,但可能是一种过早的悲观情绪。 (3认同)

Ser*_*tch 15

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