文章目录
-
- 问题来源
- 调查结果
- 测试
问题来源
在看《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返回的是修改前的值。