#include <iostream>
#include<thread>
#include<atomic>
#include<cassert>
//atomic<T*>和actomic<bool>类型的接口相同
//store()函数用于设置新的指针值,接受一个T*类型的参数作为新值。
//std::atomic的load()函数用于获取当前存储的指针值,返回类型为T*。
//std::atomic的exchange()函数用于交换当前的指针值与给定的新值,返回旧的指针值。
//std::atomic<T*> 提供的新操作是指针算术操作。
// 基本操作由 fetch_add() 和 fetch_sub() 成员函数提供,它们对存储的地址进行原子加法和减法, += 和 -= 运算符,以及递增和递减
//fetch_add() 和 fetch_sub() 返回原始值(所以 x.fetch_add(3) 会更新 x 以指向第四个值,但返回指向数组中第一个值的指针)。
// 这个操作也称为exchange-and-add,是原子读修改写操作
class A { //某一个类型
private:
int x1;
int x2;
public :
A():x1(0),x2(0){}
explicit A(int x1, int x2) :x1(x1), x2(x2) {}
};
void Test1() {
A some_array[10];
std::atomic<A*> p(some_array); //定义一个指向A的原子指针
//C++ 标准库会隐式地处理原子类型到普通类型的转换
std::cout << "p的地址为" << p << "\n"; //可以直接打印地址
std::cout << "p的地址为" << p.load() << "\n"; //或者使用load()成员函数
assert(p.load() == some_array);//此时指针指向some_array的地址
p += 2; //重载了+=,此时p指向&some_array[2]
assert(p == &some_array[2]);
p -= 1;//重载-=,此时p指向&some_array[1]
assert(p == some_array + 1);
//或者使用fetch_add成员函数,功能相当于+=,并且返回一个std::atomic<A*>,里面存放的是旧值
std::atomic<A*>old_ptr = p.fetch_add(2);
assert(old_ptr == &some_array[1]); //此时ptr指向&some_array[1]
assert(p == some_array + 3); //此时p指向&some_array[3]
//fetch_sub是类似的作用,功能相当于+=,并且返回一个std::atomic<A*>,里面存放的是旧值
auto old_p = p.fetch_sub(2);
assert(old_p == &some_array[3]); //此时old_p指向&some_array[3]
assert(p == some_array + 1); //此时p指向&some_array[1]
//也可以在调用fetch_add和fetch_sub的时候指定排序的类型
A* ptr=p.fetch_add(5, std::memory_order_release); //也可以使用类型指针直接接受
assert(ptr == some_array + 1);
assert(p.load() == some_array + 6);
}
int main(){
Test1();
return 0;
}
对atomic<T*>的操作
最新推荐文章于 2024-08-14 17:18:35 发布