4.2 常见的 atomic


std::atomic_flag

std::atomic_flag 是最简单的 bool 原子类型。

  • std::atomic_flag 类型的对象必须被 ATOMIC_FLAG_INIT 初始化,初始化为 “清除” 状态,此时互斥量处于解锁状态。
  • 不能拷贝构造、赋值给另一个 std::atomic_flag 对象。当然这是所有的原子类型特有的。因为赋值和拷贝是对两个独立的对象,在赋值和拷贝时会对第一个对象的值进行读取,然后再写入另一个,所以合并这两个操作必定不是原子的。

当这个 std::atomic_flag 类型的对象已被初始化,就只能

  • 销毁:clear(std::memory_order_release)
  • 清除或设置:test_and_set()

std::atomic_flag 实现自旋互斥锁

由于初始化 std::atomic_flag 时互斥量处于解锁状态,所以 lock 函数不断测试 test_and_set 是否返回了 false,以此来加锁。而 unlock 函数则需要清除它即可解锁。
在这里插入图片描述


std::atomic< bool >

std::atomic_flag 没有修改和查询操作,所以 std::atomic<bool> 更实用一些。

  • 其特点是可以用非原子的 bool 类型来构造和赋值。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值