ein*_*ica 7 c++ atomic compare-and-swap c++11
C++ 11对原子变量进行了"比较和交换"操作.
语义是:
原子比较值指向
obj
与所述值所指向的expected
,并且如果这些都是相等,取代了以前使用desired
(执行读-修改-写操作).否则,加载实际值所指向的obj
进入*expected
(进行负载操作).
我想做同样的事情,但不是*obj
在值相等时设置,而是希望在一个大于另一个时设置它(假设我们正在谈论一个有序类型).
这是以某种方式支持的吗?也许可以通过一些黑客实现?
注意: CAS循环不适用于我,因为我正在比较的两个值可能在非原子操作之间发生变化.
我认为你误解了比较和交换/交换是如何工作的:基本的想法是,看了当前值,你可以计算出一些相应的新值 - 然后你尝试更新.如果它成功 - 很好 - 继续你需要的任何东西,但如果它失败然后重新开始:查看其他线程放在那里的新值并考虑你现在需要的价值.
我希望它在一个大于另一个时被设置(假设我们正在讨论一个有序类型).
所以说你想要存储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...
Run Code Online (Sandbox Code Playgroud)
你仍然可以得到你想要的行为,只是潜在的更高的失败/旋转率....
根据要求,以下是我的评论作为答案:
我也希望它存在,但是据我所知(肯定不是针对x86 / x64),除了概念上,当然,还有可能(可能)使用多个原子指令(有效)的解决方法但并非必须等待)。