以下代码有什么问题?我只是尝试建立一个非常简单的线程安全堆栈,当我运行多个线程同时推送并弹出堆栈时,它有时会报告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_;
};
答案 0 :(得分:7)
我看到的主要问题是你没有正确锁定你的资源。
此:
lock_guard<mutex>(this->mtx_); // temporary
锁定后会立即解锁,因为它是暂时的,只能存在;
。
你应该像这样创建一个命名变量:
lock_guard<mutex> lock(this->mtx_); // lives till end of scope
有关临时对象的信息,请参阅: This Post。