作者:上官邱老 | 来源:互联网 | 2022-12-10 14:29
1> Jeremy Fries..:
它基本上可以工作,但有几个"陷阱"你需要注意:
如果lock()
和unlock()
调用之间的代码抛出异常(或使用return
或goto
关键字),则unlock()
可能永远不会达到调用,因此您的互斥锁将无限期地保持锁定状态.这可能会导致应用程序死锁,因为尝试锁定互斥锁的每个后续线程都将永远等待自己的lock()
返回调用.(如果您使用lock_guard/RAII方法,这种危险就会消失,这就是推荐/更安全的方法)
如果A
对象在其他线程仍然可以访问时被删除,则可能会导致未定义的行为,因为线程所依赖的成员变量mutex将被销毁.(为了避免这种情况的典型方法是确保所有线程都被join()
倒是之前,他们所依赖的破坏的互斥-或通过移动互斥出来的对象,并为一些更高级别的对象就可以保证不会在线程仍在运行时被破坏)