使用 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。
最佳答案
我相信它可以优化,除非声明为 volatile。原因是对于任何在其间交错一些线程的调度,存在不存在的有效调度。我相信 drf-sc 内存模型也是如此。
如果此线程读取介于两者之间的内容,情况就不会如此。
关于c++ - std::atomic 可以用减量抵消增量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38766077/