使用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
的行为就像一个计数器,只是线程安全的,有人可能会说他可以优化,就像它是一个普通的整数一样。
发布于 2016-08-04 20:14:02
我相信它是可以优化的,除非声明为易失性。原因是,对于任何在其间交错一些线程的调度,都存在没有交错的有效调度。我相信drf-sc内存模型也是如此。
如果此线程读取介于两者之间的内容,则不会出现这种情况。
发布于 2016-08-04 20:09:46
编译器无法优化掉atomics,因为这会违背它们的用途。它必须假设另一个线程可能也会接触到该值,因此不允许移除。
它也不能优化/重新排序对C++代码“可见”的东西,因为原子是内存屏障。
https://stackoverflow.com/questions/38766077
复制相似问题