考虑以下代码:
#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。
我在这里缺少什么?
答案 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
。这是您在实验中看到的价值。