class ThreadSafeLinkedStack {
private:  
    struct Node {  
        T data;  
        std::shared_ptr<Node> next;  
        Node(T data) : data(data), next(nullptr) {}  
    };  
    std::shared_ptr<Node> top;
    mutable std::mutex mtx; // 用于保护对top的访问
private:
    std::shared_ptr<Node> pop_unsafe() {  
        std::shared_ptr<Node> old_top = top;  
        if (old_top) {  
            top = old_top->next;  
        }  
        return old_top;  
    }
public:
    ThreadSafeLinkedStack() : top(nullptr) {}
    ~ThreadSafeLinkedStack() {
        while (top) {  
            pop_unsafe();  
        }  
    }
    T top() const {
        std::lock_guard<std::mutex> lock(mtx);  
        if (!top) {  
            throw std::out_of_range("Stack is empty!");  
        } 
        return top->data;
    }
    void push(T data) {
        std::lock_guard<std::mutex> lock(mtx);
        std::shared_ptr<Node> new_node = std::make_shared<Node>(data);  
        new_node->next = std::move(top);  
        top = std::move(new_node);  
    }
    void pop() {  
        std::lock_guard<std::mutex> lock(mtx);  
        if (!top) {  
            throw std::out_of_range("Stack is empty!");  
        }  
        pop_unsafe();  
    }    
};
// 可改成读写锁 top处理是读锁,push和pop是写锁

 

posted @ 2024-04-02 10:49  fchy822  阅读(2)  评论(0编辑  收藏  举报