问题1:当一个线程上锁了 lock(mutex),但是还没到 unlock(mutex)时该线程 terminate 了,那是不是意味着一直无法解锁了? 该如何处理这类问题呢?
问题2:在问题1的基础上,如果使用lock_guard(mutex), 当还没出lock_guard的作用域时该线程 terminate 了,是不是也是无法解锁呢?
问题1:当一个线程上锁了 lock(mutex),但是还没到 unlock(mutex)时该线程 terminate 了,那是不是意味着一直无法解锁了? 该如何处理这类问题呢?
问题2:在问题1的基础上,如果使用lock_guard(mutex), 当还没出lock_guard的作用域时该线程 terminate 了,是不是也是无法解锁呢?
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
问题1:是,当一个线程在未解锁mutex时终止,将会导致永久性锁定该mutex。这种情况被称为死锁。可以通过在程序终止前检查是否还有加锁的线程,来避免这种死锁情况,并且在必要时可以强制解锁。
问题2:是,当使用lock_guard(mutex)时,如果在lock_guard对象作用域内未调用unlock(),那么在线程终止后也会出现无法解锁的情况。 与手动使用mutex不同,使用lock_guard将确保在离开作用域之前自动解锁,因此不需要手动操作解锁。为了避免此类死锁,可以在程序关键区域使用RAII技术,例如可以使用unique_lock,scoped_lock或std::shared_lock等智能锁。