对atomic<T*>的操作

#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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值