写点什么

C++11 引入了 std::atomic 模板类无锁栈的实现如何判断栈空

作者:linux大本营
  • 2023-04-22
    湖南
  • 本文字数:584 字

    阅读完需:约 2 分钟

使用 std::atomic 模板类实现的无锁栈可以通过判断顶部指针是否为 nullptr 来判断栈是否为空。具体代码如下:


#include <atomic>
template<typename T>class LockFreeStack {private: struct Node { T data; Node* next; Node(const T& data) : data(data), next(nullptr) {} };
std::atomic<Node*> top;
public: LockFreeStack() : top(nullptr) {}
void push(const T& data) { Node* newNode = new Node(data); newNode->next = top.load(); while(!top.compare_exchange_weak(newNode->next, newNode)); }
bool pop(T& data) { Node* oldTop = top.load(); while(oldTop != nullptr && !top.compare_exchange_weak(oldTop, oldTop->next)); if(oldTop == nullptr) { return false; // 栈为空 } data = oldTop->data; delete oldTop; return true; }};
复制代码


在 pop 方法中,先用 load 方法获取顶部节点指针的值,如果该值为 nullptr,则说明栈已经为空,直接返回 false;否则,使用 compare_exchange_weak 方法将顶部指针指向下一个节点(即出栈),并返回 true。这种方法可以保证多线程环境下的线程安全性。


相关技术视频教程:c/c++ linux服务器开发/后台架构师免费学习地址

c/c++后端技术交流群:812855908

用户头像

还未添加个人签名 2020-11-26 加入

C/C++linux服务器开发群 812855908

评论

发布
暂无评论
C++11引入了std::atomic模板类无锁栈的实现如何判断栈空_多线程_linux大本营_InfoQ写作社区