std::atomic 可以用减量抵消增量吗?
Can std::atomic cancel out increments with decrements?
使用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。
编译器无法优化原子,因为那样会违反它们的用途。它必须假设另一个线程也可能触及该值,因此不允许删除。
它也不能 optimize/reorder 从前到后(以及其他方式)对 C++ 代码 'visible' 的东西,因为原子是内存屏障。
我相信它可以优化,除非声明为 volatile。原因是对于任何在其间交错一些线程的调度,存在不存在的有效调度。我相信 drf-sc 内存模型也是如此。
如果此线程读取介于两者之间的内容,情况就不会如此。
使用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。
编译器无法优化原子,因为那样会违反它们的用途。它必须假设另一个线程也可能触及该值,因此不允许删除。
它也不能 optimize/reorder 从前到后(以及其他方式)对 C++ 代码 'visible' 的东西,因为原子是内存屏障。
我相信它可以优化,除非声明为 volatile。原因是对于任何在其间交错一些线程的调度,存在不存在的有效调度。我相信 drf-sc 内存模型也是如此。
如果此线程读取介于两者之间的内容,情况就不会如此。