【发布时间】:2016-12-10 12:03:21
【问题描述】:
使用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 一样进行优化。
【问题讨论】:
-
如果您发现它没有优化,您是否已经有了答案?
-
@rustyx:这不是它的工作原理。仅仅因为 OP 的实现这次没有对其进行优化,并不意味着禁止这样的优化。
-
试图回答这个问题,但我对第 29.3 节中的术语不够熟悉。期待答案!
-
我认为编译器可以或可以优化这一点,除非您引入显式内存防护。但同样,我不会完全肯定地说任何关于原子的事情:)
-
也许这个链接会提供更多的见解。 playingwithpointers.com/ipo-and-derefinement.html
标签: c++ multithreading c++11 atomic compiler-optimization