代码之家  ›  专栏  ›  技术社区  ›  Fanatic23

g++cas的奇怪行为

  •  0
  • Fanatic23  · 技术社区  · 14 年前

    考虑此代码:

    #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 回复  |  直到 14 年前
        1
  •  4
  •   clstrfsck    14 年前

    来自GCC文件:

    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_157;版本返回true。__val_157;版本返回操作前的*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;
    }
    
        2
  •  0
  •   AnT stands with Russia    14 年前

    你在用你的 lock 变量作为参数 __sync_val_compare_and_swap (指向) 和收件人的返回值为 _同步值比较和交换 . 这似乎没什么意义。你对什么价值感兴趣?通过第一个参数返回的那个?或者作为返回值返回的 _同步值比较和交换 ?相应地决定你需要哪一个动作。

    现在看起来 _同步值比较和交换 存储在 最后。这个值应该是 0 ,根据规范 _同步值比较和交换 . 这就是你在实验中看到的价值。