atomic_compare_exchange用大于而不是等于?

问题描述 投票:7回答:3

C ++ 11对atomic variables具有'比较和交换'操作。

语义是:

以原子方式将obj指向的值与expected指向的值进行比较,如果它们是等于,则将前者替换为desired(执行读-修改-写操作)。否则,将obj指向的实际值加载到*expected中(执行加载操作)。

我想做同样的事情,但是我不想在值相等时设置*obj,而是希望当一个值小于另一个值[[大于时设置它(假设我们在谈论有序类型) )。

以某种方式支持吗?也许可以通过一些黑客实现?

注意:

CAS循环对我不起作用,因为我正在比较的两个值在非原子操作之间可能会发生变化。
c++ c++11 atomic compare-and-swap
3个回答
5
投票
根据要求,以下是我的评论作为答复:


我也希望它存在,但是据我所知(当然不是针对x86 / x64),当然,从概念上讲,它和可能(可能)使用多个原子指令的变通办法(哪些可以工作,但并非需要等待)。

7
投票
我认为您误会了比较和交换/交换的工作原理:基本思想是,查看当前值后,您可以算出一些相应的新值-然后尝试进行更新。如果成功-很好-继续执行您需要执行的所有操作,但是如果失败,则重新开始:查看其他线程在其中放置的新值,并考虑您现在需要的值。

我希望在一个大于另一个时设置它(假设我们在谈论有序类型)。

因此,您要存储11,但是仅当现有值仍然原子上小于11时,您才能找到直接执行该操作的指令,但是可以通过现有的比较和交换轻松地进行存储:

int target_value = 11; do { int snapped_x = x; if (snapped_x >= target_value) what do you want to do instead? } while (!compare_and_swap(x, snapped_x, target_value)); // ...or whatever your exact calling convention is...

您仍然会获得所需的行为,只是故障/自转率可能更高。...

0
投票
这可能是一个古老的问题,但是我认为许多人都想要这种功能。我想出了一个主意,在这里显示伪代码(我是linux内核的人,所以要使用一些内核函数)。

update(new) { old = atomic_read(&pvalue); while (old < new) { v = atomic_cmpxchg(&pvalue, old, new); if (v != old) { old = v; continue; } } }

代码不会为旧值小于新值尝试cmpxchg。如果有并发问题,请告诉我。谢谢:)
© www.soinside.com 2019 - 2024. All rights reserved.