C++线程安全无锁栈的实现
请用C++11原子操作实现一个线程安全的无锁栈(Lock-Free Stack)。
回答
我是大山
基于CAS的无锁栈实现:
template<typename T>
class LockFreeStack {
struct Node {
T data;
Node* next;
Node(const T& d, Node* n) : data(d), next(n) {}
};
std::atomic<Node*> head{nullptr};
public:
void push(const T& value) {
Node* new_node = new Node(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));
}
bool pop(T& value) {
Node* old_head = head.load(std::memory_order_relaxed);
while (old_head && !head.compare_exchange_weak(
old_head, old_head->next,
std::memory_order_acquire, std::memory_order_relaxed));
if (!old_head) return false;
value = std::move(old_head->data);
// 注意:这里存在ABA问题,生产环境需使用hazard pointer或RCU
delete old_head;
return true;
}
};
注意事项:此实现存在ABA问题,生产环境需引入Hazard Pointer或引用计数方案。
CAS + 循环是构建无锁数据结构的基础模式。