假设有两个线程,主线程和线程B(由main创建)。如果B获得了一个互斥体(如pthread_mutex),并且它已经调用pthread_exit而不解锁该锁。那么互斥体会发生什么?它是免费的吗?当获取它的线程退出时,Mutex会发生什么?
15
A
回答
14
10
如果在调用pthread_mutex_init
之前创建通过建立正确的属性强大的互斥体,互斥体将进入当一种特殊状态保存锁的线程终止,下一个尝试获取互斥锁的线程将获得错误EOWNERDEAD
。然后它负责清除互斥锁保护的任何状态,并呼叫pthread_mutex_consistent
使互斥锁再次可用,或者调用pthread_mutex_unlock
(这会使互斥锁永久不可用;进一步尝试使用它将返回ENOTRECOVERABLE
)。
对于不可靠的互斥锁,如果锁定它的线程在未解锁的情况下终止,则该互斥锁永久不可用。根据标准(请参阅奥斯汀集团跟踪器上issue 755的决议),互斥锁保持锁定状态,其正式所有权继续属于退出的线程,任何试图锁定它的线程都会死锁。如果另一个线程试图解锁它,那通常是未定义的行为,除非互斥体是使用PTHREAD_MUTEX_ERRORCHECK
属性创建的,在这种情况下将返回一个错误。另一方面,许多(大多数?)真实世界的实现实际上并不遵循标准的要求。尝试从另一个线程锁定或解锁互斥锁可能会虚假成功,因为线程ID(用于跟踪所有权)可能已被重用,并且现在可能引用另一个线程(可能是发出新的锁定/解锁请求的线程)。已知至少glibc的NPTL表现出这种行为。
相关问题
- 1. 当JVM退出时,堆中的对象会发生什么?
- 2. 当FlatFileFooterCallback出错时会发生什么?
- 3. 线程试图获取pthread_mutex_lock(&mutex)如果他们没有获取锁,会发生什么?
- 4. 当SIGCANCEL发送到线程时会发生什么?
- 5. 当Docker容器的PID1退出时,其他进程会发生什么?
- 6. 未能获取锁的线程会发生什么情况?
- 7. 当主线程终止时,SynchronizationContext会发生什么?
- 8. 当某个线程调用Thread.interrupt()时,会发生什么?
- 9. 什么是H.450.2?当它不存在时会发生什么?
- 10. 取消时线程的内存会发生什么变化?
- 11. 当程序运行时发生事件时会发生什么
- 12. ASP.Net的自动回发。当它太慢时会发生什么?
- 13. 当父线程退出时,Python守护进程线程不会退出
- 14. .NET线程抛出异常时会发生什么?
- 15. 当线程意外退出时抛出什么异常?
- 16. 线程什么时候退出?
- 17. 当一个线程完成其互斥量时,线程会发生什么?
- 18. 当主线程调用sys.exit()时,其他线程会发生什么?
- 19. 当一个线程被阻塞时,其他线程会发生什么?
- 20. 当第一个线程锁定类时第二个线程会发生什么
- 21. 当线程T1加入线程T2和T2时会发生什么事情会发生中断
- 22. 发生,当它退出函数
- 23. 当:: thread :: wait存在时,为什么我的tcl线程退出?
- 24. 如果当前线程崩溃,那么readwritelock会发生什么
- 25. 当主线程退出时,如何让子线程退出?
- 26. 当一个事件从一个任务中被触发时会发生什么?它会有单独的线程?
- 27. 当主线程针对另一个调度队列发出dispatch_sync时,主队列/主线程会发生什么?
- 28. 线程结束后会发生什么?
- 29. ConcurrentHashMap.clear()读线程会发生什么?
- 30. 当它被克隆时,关闭的delagate会发生什么?
Merci Beaucoup !!!非常感谢 !!! – Sadish 2010-12-12 21:43:47
另一个线程无法解锁它,除非它是一个强大的互斥锁。 – 2010-12-12 22:08:13
哇,一个没有线程亲和力的'互斥'?没有“被遗弃”的错误状态? – 2010-12-12 22:10:24