C ++ 11对atomic variables具有'比较和交换'操作。
语义是:
以原子方式将
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...
您仍然会获得所需的行为,只是故障/自转率可能更高。...
update(new)
{
old = atomic_read(&pvalue);
while (old < new) {
v = atomic_cmpxchg(&pvalue, old, new);
if (v != old) {
old = v;
continue;
}
}
}
代码不会为旧值小于新值尝试cmpxchg。如果有并发问题,请告诉我。谢谢:)