compare_exchange 基本使用

参考博客:C++内存模型

compare_exchange_weak基本使用
bool compare_exchange_weak( T& expected, T desired,
                           std::memory_order success,
                           std::memory_order failure );
  • expected:期望的值
  • desired 想要写入的值
    如果obj和期望的值相同,则写入desired并且返回true,否则将obj值写入expected并返回fasle。此处不考虑伪失败的可能性。
	// 场景一:failed 
	std::atomic_int aival = 10;
	int expect_val = 20;
	bool bc = aival.compare_exchange_strong(expect_val, 30);
	// bc:false  expect_val:10 aival=10

	//场景二:success
	aival = 10;
	expect_val = 10;
	bc = aival.compare_exchange_strong(expect_val, 30);
	// bc:true  expect_val:10 aival=30
	
	//场景三:failed,伪失败,某些机器缺少compare-and-exchange原子指令
	//导致该操作执行一半的时候被别的线程打断,此时expect_val不会被更改
	aival = 10;
	expect_val = 10;
	bc = aival.compare_exchange_strong(expect_val, 30);
	// bc:false  expect_val:10 aival=10
compare_exchange_weak和compare_exchange_strong的区别

compare_exchange_weak可能存在伪失败的情况。即虽然对象值和expected一致,但是在更新至desired的过程中,行为被打断,导致返回false。
compare_exchange_strong不存在伪失败的情况。只要对象值和expected一致即返回true。即使更新失败,

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值