C++原子负载排序效率
C++ atomic load ordering efficiency
我有一个内存变量,它在线程a中更新,并在其他线程中读取。读取器只关心该值是否为非零。我保证,一旦值增加,它就永远不会回到零。按以下方式进行优化有意义吗?换句话说,在读者方面,一旦我的条件得到满足,我就不需要"围栏"了。
std::atomic<int> counter;
writer:
increment()
{
counter.store(counter+1, std:memory_order_release)
}
reader:
iszero()
{
if (counter.load(std::memory_order_relaxed) > 0) return false;
// memory fence only if condition not yet reached
return (counter.load(std::memory_order_acquire) == 0);
}
首先,如果您还没有真正尝试使用默认的(顺序一致的)原子,测量应用程序的性能,对其进行分析,并观察到它们导致性能问题,我建议现在就回头。
然而,如果你真的需要开始对宽松的原子论进行推理。。。
尽管它几乎肯定会在x86上运行,但这并不能保证达到您的预期。
我猜您是在使用它来保护其他一些非原子数据的发布。
在这种情况下,您需要保证如果您在读取器线程中读取了一个非零值,则在存储之前在编写器线程中对非原子内存位置产生的各种其他副作用(即初始化您正在发布的数据)将对读取器线程可见。
用std::memory_order_relaxed
读取非零不会与std::memory_order_release
存储同步,因此您上面的代码没有此保证。
要获得我所描述的行为,您需要使用std::memory_order_acquire
。如果您使用的是x86,那么acquire不会生成任何内存围栏指令,因此它与memory_order_relaxed
在性能上不同的唯一方法是阻止一些编译器优化。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- 与C++std::map::insert行为相比,C#排序字典的效率
- C++原子负载排序效率
- 为什么我的快速排序效率如此低下
- 排序效率 算法与输入范围相关
- 为什么快速排序在有许多重复元素的情况下效率低下
- 如何利用模拟退火的概念来提高这个代码的排序效率
- 计时排序算法的效率,但得到不正确的输出