当用2个螺纹锁定时,将recursive_mutex死锁
Will recursive_mutex deadlock when locked by 2 threads?
std ::当相同线程多次锁定时,recursive_mutex不会死锁。
当多次锁定多次锁定时,它会死锁吗?
当多个线程多次锁定多次时,它会死吗?
不可能发生。
by 定义 mutex最多被一个线程锁定。std::recursive_mutex
是某种静音。否则,它不符合相互排斥的目标,因为它应该是某种静音概念。
因此,甚至不允许另一个线程锁定一次。当这样做时,其他线程会阻止(直到锁定锁定 - 递归锁定的次数多倍(。
fyi,这是递归静音的简单实现:
static const std::thread_id NO_THREAD;
class recursive_mutex {
public:
void lock() {
auto me = std::this_thread::get_id();
if (owner != me) {
mtx.lock();
owner = me;
assert(count == 0);
}
count++;
}
void unlock() {
auto me = std::this_thread::get_id();
assert(owner == me);
assert(count > 0);
count--;
if (count == 0) {
owner = NO_THREAD;
mtx.unlock();
}
}
private:
std::mutex mtx;
std::thread::id owner;
unsigned count{0};
};
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- Recursive lambda C++17
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- std::shared_timed_mutex何时比std::mutex慢,以及何时(不)使用它
- <mutex> 使用 /clr 或 /clr:pure 编译时不支持
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 返回持有 std::mutex 锁的 RAII 容器类
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- "How to make a recursive call for palindrom numbers without reverse function in c++?"
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象