首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++11 CAS操作需要两个指针参数?

为什么C++11 CAS操作需要两个指针参数?
EN

Stack Overflow用户
提问于 2013-04-17 01:50:01
回答 2查看 5.1K关注 0票数 14

许多C++11 CAS操作(例如,atomic_compare_exchange_weakatomic_compare_exchange_strong)需要两个指针和一个值,即如下所示:

代码语言:javascript
复制
bool atomic_compare_exchange(T* pointer, T* expected,       // pseudodeclaration!
                             T desired);

相比之下,微软、gcc和英特尔的CAS操作都采用一个指针和两个值:

代码语言:javascript
复制
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函数接受两个指针和一个值,而不是看起来更传统的一个指针和两个值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 01:57:04

C++11方法更有用:如果交换失败,则将*expected更新为新的当前值。这使得在循环中使用函数变得很容易:

代码语言:javascript
复制
T value = x.load();
T newvalue = frob(value);

while (!atomic_compare_exchange(&x, &value, newvalue))
{
    newvalue = frob(value);
}

有了微软的签名,测试操作是否成功就更麻烦了,GCC的__sync_type版本也是如此。使用GCC的__sync_bool,您甚至需要在每次交换失败时执行另一次加载。

票数 23
EN

Stack Overflow用户

发布于 2014-02-22 04:59:54

我不明白为什么你不能两者兼得。在我的用例中,C++版本就没那么有用了。我想等到一个变量有了某个值,然后我想把它设置成一个新的值。

有了GCC的帮助:

代码语言:javascript
复制
while (!__sync_bool_compare_and_swap(&value, expected, desired)) { }

使用C++11:

代码语言:javascript
复制
auto tmp = expected;
while (!value.compare_exchange_weak(tmp,desired)) 
{
  tmp = expected;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16043723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档