【发布时间】:2020-05-04 07:59:22
【问题描述】:
在“Concurrency in Action”一书中,有一个线程安全堆栈的实现,在进入 pop() 和 empty() 函数时获取/锁定互斥锁,如下所示:
class threadsafe_stack {
private:
std::stack<T> data;
mutable std::mutex m;
public:
//...
void pop(T& value) {
std::lock_guard<std::mutex> lock(m);
if(data.empty()) throw empty_stack();
value = std::move(data.top());
data.pop();
}
bool empty() const {
std::lock_guard<std::mutex> lock(m);
return data.empty();
}
};
我的问题是,当一个在进入 pop() 时获得锁的线程正在调用也受互斥锁保护的 empty() 时,这段代码如何不会陷入死锁?如果 lock() 由已经拥有互斥锁的线程调用,那不是未定义的行为吗?
【问题讨论】:
标签: c++ multithreading concurrency