G ++ CAS的奇怪行为

时间:2010-11-13 10:33:48

标签: c++ multithreading

考虑以下代码:

#include <iostream>
using namespace std;

int main()
{
   bool lock = false;
   lock = __sync_val_compare_and_swap( &lock, false, true );
   cout << lock << endl;
}

我希望结果显示为1,但o / p为0.只需调用__sync_val_compare_and_swap( &lock, false, true );(因此不会捕获返回值),然后显示锁定结果显示为1。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:4)

来自GCC doco:

  

bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)   type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)

     

这些内置函数执行原子比较和交换。也就是说,如果* ptr的当前值是oldval,则将newval写入* ptr。

     

如果比较成功并且写入了newval,则“bool”版本返回true。 “val”版本在操作之前返回* ptr的内容。

对我来说,0是正确的价值。我认为您错误地将“...操作前*ptr的内容”分配给lock

这应该会产生明智的结果:

#include <iostream>
using namespace std;

int main()
{
   bool lock = false;
   bool oldvalue = __sync_val_compare_and_swap( &lock, false, true );
   cout << lock << ", " << oldvalue << endl;
}

答案 1 :(得分:0)

您正在使用lock变量作为__sync_val_compare_and_swap的参数(传递lock的指针)和返回值__sync_val_compare_and_swap的收件人。这似乎没有多大意义。您对哪个值感兴趣?通过第一个参数返回的那个?或者返回的值为__sync_val_compare_and_swap的返回值?决定你需要采取相应的行动。

现在看来__sync_val_compare_and_swap的返回值最后存储在lock中。根据{{​​1}}的规范,该值应为0。这是您在实验中看到的价值。