c++ - std::atomic 可以用减量抵消增量吗?

标签 c++ multithreading c++11 atomic compiler-optimization

使用 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/

相关文章:

multithreading - 莫霍利奇 : Limiting number of Promises/IOLoop->subprocess

c++ - 如何将 lambda (c++11) 传递给模板函数?

c++ - 使用 OpenCV 将图像从 YV12 转换为 NV12

Python multiprocessing.managers.BaseManager 按顺序运行注册的可调用函数

.net - 在 C# 中一次下载多个 HTML

C++:初始化成员数据时的奇怪行为

c++ - 应用具有通用引用的 SFINAE 模式

c++ - 类中类

C++ 队列不喜欢少于 8 个字符*

c++ - 使用C++线程构建管道结构