天天看点

std::atomic exchage的一点理解

文章目录

    • 问题来源
    • 调查结果
    • 测试

问题来源

在看《C++ Concurrency In Action》中的7.5清单代码时开始感觉其中的这一段代码很奇怪:

node* nodes_to_delete=to_be_deleted.exchange(nullptr);//2声明“可删除”列表
           

难道nodes_to_delete to_be_deleted 都是空指针?

调查结果

猜想to_be_deleted.exchange返回的应该是比较/交换前的值才可以说的通。google了一下exchange的用法

中有一句:

The contained value before the call.
T is atomic's template parameter (the type of the contained value).
           

没错返回的值测试调用前的结果,猜想是对的。为了进一步的确认一下,写了一个测试程序。

测试

#include<iostream>
  #include <atomic>
  using namespace std;
  int main()
   {
          int b=10;
          std::atomic<int*> to_be_deleted;
           to_be_deleted.exchange(&b);
          int a=1;
          int *nodes_to_delete=to_be_deleted.exchange(&a);
          std::cout << *to_be_deleted << std::endl;
          std::cout << *nodes_to_delete << std::endl;
          return 1;
 }
           

看一下测试结果:

[email protected]:/tmp# ./test 
1
10
           

果然*nodes_to_delet返回的是修改前的值。

继续阅读