std :: atomic可以用减量取消增量吗?

时间:2016-08-04 11:25:47

标签: c++ multithreading c++11 atomic compiler-optimization

使用relaxed memory order,例如对于引用计数指针,是否允许编译器优化掉后续的递增和递减?

std::atomic_int32_t ai;
for (size_t i = 0; i < 10000; i++)
{
    ai.fetch_add(1, std::memory_order_relaxed);
    ai.fetch_sub(1, std::memory_order_relaxed);
}

看看反汇编看起来不像。但是由于允许重新排序并且atomic表现得像一个计数器,只是线程安全,可以说他可以优化,好像它是一个普通的int。

2 个答案:

答案 0 :(得分:4)

我相信它可以被优化,除非声明为volatile。原因是对于任何在其间交错某些线程的调度,存在没有的有效调度。我相信drf-sc内存模型也是如此。

如果这个线程在两者之间读取内容,则不会是这种情况。

答案 1 :(得分:-3)

编译器无法优化原子,因为这会违反它们的原因。它必须假设另一个线程也可能触及该值,因此不允许删除。

它也无法优化/重新排序“可见”的内容。因为原子是内存障碍所以从前到后(以及其他方式)的C ++代码。