atomic_compare_exchange用大于而不是等于?

ein*_*ica 7 c++ atomic compare-and-swap c++11

C++ 11对原子变量进行了"比较和交换"操作.

语义是:

原子比较值指向obj与所述值所指向的expected,并且如果这些都是相等,取代了以前使用desired(执行读-修改-写操作).否则,加载实际值所指向的obj进入*expected(进行负载操作).

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

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

注意: CAS循环不适用于我,因为我正在比较的两个值可能在非原子操作之间发生变化.

Ton*_*roy 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...
Run Code Online (Sandbox Code Playgroud)

你仍然可以得到你想要的行为,只是潜在的更高的失败/旋转率....

  • 这并没有真正帮助我,因为我的目标值可以在我在此循环中执行的每个原子指令之后发生变化。 (2认同)
  • 那没有帮助。一旦我到达 while 条件,“target_value”就不再是“要做什么”语句中的内容。 (2认同)

Cam*_*ron 5

根据要求,以下是我的评论作为答案:


我也希望它存在,但是据我所知(肯定不是针对x86 / x64),除了概念上,当然,还有可能(可能)使用多个原子指令(有效)的解决方法但并非必须等待)。