【发布时间】:2023-04-05 00:34:01
【问题描述】:
C++11 对atomic variables 有一个“比较和交换”操作。
语义是:
原子地比较
obj指向的值和expected指向的值,如果它们相等,用desired替换前者(执行读-修改-写手术)。否则,将obj指向的实际值加载到*expected中(执行加载操作)。
我也想这样做,但不是在值相等时设置*obj,而是希望在一个大于另一个时设置它(假设我们正在谈论关于有序类型)。
这是否以某种方式支持?也许可以通过一些 hack 来实现?
注意: CAS 循环不适合我,因为我比较的两个值都可能在非原子操作之间发生变化。
【问题讨论】:
-
这个循环很简单,相信很快就会有人给你详细的,但是告诉我,你想怎么用这个操作?
-
你可以做一个 CAS 循环,比如 stackoverflow.com/questions/16190078/… 。即使我理解正确,这也可能是重复的。
-
你的意思是 obj 是一个指向有序对象的指针,你想根据你指向的两个对象的比较结果来设置一个指针吗?如果是这样:这是不可能的,因为 CAS 只处理一个内存地址。您的请求至少处理两个内存地址:指针变量的地址(您要交换的东西)和您要比较的数据的地址。
-
我也希望它存在,但它不存在(当然,除了在概念上,以及(可能)使用多个原子指令的变通方法)。
标签: c++ c++11 atomic compare-and-swap