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是写锁