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

Bor*_*rph 8 c++ multithreading atomic compiler-optimization c++11

使用宽松的存储顺序,例如对于引用计数指针,是否允许编译器优化掉后续的递增和递减?

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

看看反汇编它看起来不像.但是由于允许重新排序并且atomic行为类似于计数器,只是线程安全,人们可以争辩说他可以优化,好像它是一个普通的int.

Ela*_*zar 5

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

如果该线程读取介于两者之间的内容,情况就不会如此。

  • @Revolver_Ocelot:即使获取-释放也是不够的。有一个简单的线程调度,其中在任何其他线程运行单个指令之前,所有 10.000 增量和 10.000 减量都发生在该线程上。(这甚至是单核处理器上的现实线程调度) (2认同)