内存序与无锁编程
C++内存序与无锁编程详解:std::memory_order。
1. 内存序
enum memory_order {
memory_order_relaxed, // 无顺序保证
memory_order_consume, // 数据依赖顺序
memory_order_acquire, // 获取语义
memory_order_release, // 释放语义
memory_order_acq_rel, // 获取+释放
memory_order_seq_cst // 顺序一致(默认)
};
2. 各内存序含义
2.1 relaxed
std::atomic<int> counter{0};
counter.fetch_add(1, std::memory_order_relaxed);
// 只保证原子性,不保证顺序
2.2 acquire/release
std::atomic<bool> ready{false};
int data = 0;
// 线程 A
data = 42;
ready.store(true, std::memory_order_release);
// 线程 B
while (!ready.load(std::memory_order_acquire)) {}
// 保证看到 data = 42
3. 无锁编程示例
template<typename T>
class LockFreeStack {
struct Node {
T data;
Node* next;
};
std::atomic<Node*> head_{nullptr};
public:
void push(T value) {
Node* new_node = new Node{std::move(value), head_.load(std::memory_order_relaxed)};
while (!head_.compare_exchange_weak(new_node->next, new_node,
std::memory_order_release, std::memory_order_relaxed)) {}
}
};
4. ABA 问题
CAS 操作可能遇到 ABA 问题:值从 A 变为 B 再变回 A,CAS 认为没有变化。解决方案:带版本号的指针或 std::atomic<std::shared_ptr>。