【发布时间】:2020-07-24 19:47:58
【问题描述】:
我有多线程程序,它只有 1 个互斥锁。我想让程序在它已经拥有锁的情况下尝试获取锁时终止。
我的实际程序相当复杂。当然,我们会尽量避免编程级别的死锁。但万一我们错过了一个边缘情况,我们宁愿它立即失败而不是死锁。
请参阅下面的最小示例。
std::mutex lock;
void f1() {
std::lock_guard<mutex> guard1(lock);
// some code ...
}
void f2() {
std::lock_guard<mutex> guard2(lock);
f1(); // Will deadlock here! How can I make it terminate instead of deadlock?
}
【问题讨论】:
-
在这种情况下你是怎么结束的?重新考虑程序逻辑可能会更好,这样它就不会发生。等一等。这只是一个简化的例子。没关系。忽略那个咆哮的老傻瓜。
-
学究但......您断言同一线程多次锁定
std::mutex"Will deadlock..."是不正确的。严格来说,这是未定义的行为。 -
@G.M. “严格来说这是未定义的行为” - 除非使用递归互斥锁,否则它是明确定义的。
-
@RemyLebeau 是的,但显示的代码使用了
std::mutex lock;。