std::atomic_bool 详解

std::atomic_bool 是 C++11 引入的一个原子布尔类型,它允许你在多线程环境中安全地对布尔值进行原子操作,而无需额外的同步机制(如互斥锁)。然而,值得注意的是,在 C++11 及以后的版本中,推荐使用 std::atomic<bool> 而不是 std::atomic_bool,因为 std::atomic<bool> 是 std::atomic_bool 的特化版本,并且 std::atomic<T> 提供了一个更通用的模板化接口。

基本使用

首先,你需要包含 <atomic> 头文件来使用 std::atomic<bool>

#include <atomic>
std::atomic<bool> flag(false); // 初始化一个原子布尔值

原子操作

你可以使用以下操作来安全地修改和读取 std::atomic<bool> 的值:

  • store(bool desired): 存储一个新值。
  • load(std::memory_order order = std::memory_order_seq_cst): 加载当前值。
  • exchange(bool desired, std::memory_order order = std::memory_order_seq_cst): 用新值替换当前值,并返回旧值。
  • compare_exchange_weak(bool& expected, bool desired, std::memory_order success = std::memory_order_seq_cst, std::memory_order failure = std::memory_order_seq_cst): 如果当前值等于 expected,则用 desired 替换它,并返回 true。否则,将 expected 设置为当前值,并返回 false
  • compare_exchange_strong(bool& expected, bool desired, std::memory_order success = std::memory_order_seq_cst, std::memory_order failure = std::memory_order_seq_cst): 与 compare_exchange_weak 类似,但通常不提供“可能失败”的弱保证。

另外,std::atomic<bool> 还重载了大多数算术和位操作符,如 operator=operator++operator--operator&= 等,但它们通常不适用于布尔类型,所以你可能只会用到 operator= 和 operator==operator!= 等比较操作符。

示例

#include <atomic>
#include <thread>
#include <iostream>
std::atomic<bool> flag(false);
void worker_thread() {
while (!flag.load()) {
// 等待标志位变为 true
}
std::cout << "Worker thread is running!\n";
}
int main() {
std::thread t(worker_thread);
// ... 做一些其他工作 ...
flag.store(true); // 设置标志位为 true,通知工作线程开始执行
t.join();
return 0;
}

在这个示例中,我们创建了一个工作线程,该线程在一个循环中等待 flag 变为 true。在主线程中,我们做一些其他工作,然后设置 flag 为 true,从而通知工作线程开始执行。由于 flag 是一个 std::atomic<bool>,因此我们可以安全地在多线程环境中修改和读取它,而无需担心数据竞争或其他并发问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值