我的简单线程安全堆栈有什么问题?

yan*_*jin 2 c++ multithreading

以下代码有什么问题?我只是尝试建立一个非常简单的线程安全堆栈,当我运行多个线程同时推送并弹出堆栈时,它有时会报告0xC0000005异常.

#include <stack>
#include <list>
#include <memory>
#include <mutex>


template<class T> class Stack{
    typedef stack < shared_ptr<T>, list<shared_ptr<T>>> Stack_;
public:
    Stack(){}
    Stack(const Stack& other){
        lock_guard<mutex>(other.mtx_);
        stack_ = other.stack_;
    }
    void push(shared_ptr<T> value){
        lock_guard<mutex>(this->mtx_);
        stack_.push(value);
    }
    shared_ptr<T> pop(){
        lock_guard<mutex>(this->mtx_);
        if (stack_.empty()) return nullptr;
        auto res = stack_.top();
        stack_.pop();
        return res;
    }
private:
    mutex mtx_;
    Stack_ stack_;
};
Run Code Online (Sandbox Code Playgroud)

Gal*_*lik 7

我看到的主要问题是你没有正确锁定你的资源.

这个:

lock_guard<mutex>(this->mtx_); // temporary
Run Code Online (Sandbox Code Playgroud)

锁定之后会立即解锁,因为它是暂时的,只能活到;.

你应该像这样创建一个命名变量:

lock_guard<mutex> lock(this->mtx_); // lives till end of scope
Run Code Online (Sandbox Code Playgroud)

有关 临时对象的信息,请参阅:此帖子.