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 (!()) { |
|
// 等待标志位变为 true |
|
} |
|
std::cout << "Worker thread is running!\n"; |
|
} |
|
int main() { |
|
std::thread t(worker_thread); |
|
// ... 做一些其他工作 ... |
|
(true); // 设置标志位为 true,通知工作线程开始执行 |
|
(); |
|
return 0; |
|
} |
在这个示例中,我们创建了一个工作线程,该线程在一个循环中等待 flag
变为 true
。在主线程中,我们做一些其他工作,然后设置 flag
为 true
,从而通知工作线程开始执行。由于 flag
是一个 std::atomic<bool>
,因此我们可以安全地在多线程环境中修改和读取它,而无需担心数据竞争或其他并发问题。