许多C++11 CAS操作(例如,atomic_compare_exchange_weak、atomic_compare_exchange_strong)需要两个指针和一个值,即如下所示:
bool atomic_compare_exchange(T* pointer, T* expected, // pseudodeclaration!
T desired);相比之下,微软、gcc和英特尔的CAS操作都采用一个指针和两个值:
long InterlockedCompareExchange(long* pointer, long desired, // Microsoft
long expected);
int __sync_bool_compare_and_swap (T* pointer, T expected, // gcc and
T desired); // Intel为什么C++11 CAS函数接受两个指针和一个值,而不是看起来更传统的一个指针和两个值?
发布于 2013-04-17 01:57:04
C++11方法更有用:如果交换失败,则将*expected更新为新的当前值。这使得在循环中使用函数变得很容易:
T value = x.load();
T newvalue = frob(value);
while (!atomic_compare_exchange(&x, &value, newvalue))
{
newvalue = frob(value);
}有了微软的签名,测试操作是否成功就更麻烦了,GCC的__sync_type版本也是如此。使用GCC的__sync_bool,您甚至需要在每次交换失败时执行另一次加载。
发布于 2014-02-22 04:59:54
我不明白为什么你不能两者兼得。在我的用例中,C++版本就没那么有用了。我想等到一个变量有了某个值,然后我想把它设置成一个新的值。
有了GCC的帮助:
while (!__sync_bool_compare_and_swap(&value, expected, desired)) { }使用C++11:
auto tmp = expected;
while (!value.compare_exchange_weak(tmp,desired))
{
tmp = expected;
}https://stackoverflow.com/questions/16043723
复制相似问题