#include <atomic>
是 C++ 中引入原子操作的标准库头文件。它提供了一组用于支持多线程编程的原子类型和操作,可以在不使用锁的情况下安全地进行并发数据访问。
主要组件
以下是 <atomic>
中的一些关键组件:
原子类型:
std::atomic<T>
:提供对任意类型T
的原子操作。std::atomic_flag
:轻量级的布尔标志,用于实现简单的锁机制。
原子操作:
load()
:获取当前值(只读)。store()
:设置新值(写入)。exchange()
:交换当前值与新值,返回旧值。fetch_add()
,fetch_sub()
, etc.:进行加减等运算并返回旧值。test_and_set()
:将标志设置为 true,并返回之前的值。
内存序: 可以在多线程编程中控制操作的顺序,以保证正确性和性能,包括:
std::memory_order_relaxed
std::memory_order_acquire
std::memory_order_release
- 以及其他组合方式,如
seq_cst
,acq_rel
, 等。
示例代码
以下是一个使用 <atomic>
实现简单计数器的示例:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0); // 初始化 atomic 类型计数器
void increment(int num_increments) {
for (int i = 0; i < num_increments; ++i) {
counter.fetch_add(1, std::memory_order_relaxed); // 原子增加
}
}
int main() {
const int num_threads = 10;
const int increments_per_thread = 1000;
std::thread threads[num_threads];
// 创建多个线程以增量计数器
for (int i = 0; i < num_threads; ++i) {
threads[i] = std::thread(increment, increments_per_thread);
}
// 等待所有线程完成
for (auto& thread : threads) {
thread.join();
}
std::cout << "Final counter value: " << counter.load() << std::endl; // 输出最终结果
return 0;
}
注意事项
- 使用
<atomic>
提供的数据结构时,需要确保数据访问之间不存在其他形式的数据竞争。 - 尽管原子操作比传统的锁机制性能更高,但对于复杂数据结构,可能仍需要使用互斥量(mutex)来确保数据完整性。
- 理解不同内存序之间的差异可以帮助你写出更加高效且安全的并发代码。
内容由零声教学AI助手提供,问题来源于学员提问