Giả sử có hai luồng, chủ đề chính và nói chuỗi B (được tạo bởi chính). Nếu B mua một mutex (nói pthread_mutex) và nó đã được gọi là pthread_exit mà không cần mở khóa. Vậy điều gì sẽ xảy ra với mutex? Nó có trở thành miễn phí không?Điều gì sẽ xảy ra với Mutex khi chuỗi đã thoát khỏi nó?
Trả lời
Nếu bạn đã tạo một mutex mạnh mẽ bằng cách thiết lập các thuộc tính ngay trước khi gọi pthread_mutex_init
, mutex sẽ đi vào trạng thái đặc biệt khi chủ đề giữ khóa chấm dứt và chuỗi tiếp theo để tìm cách lấy được mutex sẽ gặp lỗi EOWNERDEAD
. Sau đó, nó chịu trách nhiệm làm sạch bất kỳ trạng thái nào mà mutex bảo vệ và gọi pthread_mutex_consistent
để làm cho mutex có thể sử dụng lại hoặc gọi số pthread_mutex_unlock
(điều này sẽ làm cho mutex vĩnh viễn không thể sử dụng được; các nỗ lực tiếp tục sử dụng nó sẽ trả về ENOTRECOVERABLE
).
Đối với các mutex không mạnh, mutex sẽ không thể sử dụng vĩnh viễn nếu chuỗi bị khóa chấm dứt mà không mở khóa. Theo tiêu chuẩn (xem độ phân giải issue 755 trên bộ theo dõi Nhóm Austin), mutex vẫn bị khóa và quyền sở hữu chính thức của nó tiếp tục thuộc về chuỗi đã thoát và bất kỳ chuỗi nào cố gắng khoá nó sẽ bế tắc. Nếu một chuỗi khác cố gắng mở khóa, đó là hành vi không xác định thông thường, trừ khi mutex được tạo với thuộc tính PTHREAD_MUTEX_ERRORCHECK
, trong trường hợp đó, lỗi sẽ được trả về.
Mặt khác, nhiều triển khai thực tế nhất trong thế giới thực không thực sự tuân thủ các yêu cầu của tiêu chuẩn. Một nỗ lực để khóa hoặc mở khóa mutex từ một thread khác có thể thành công giả, vì id thread (được sử dụng để theo dõi quyền sở hữu) có thể đã được sử dụng lại và bây giờ có thể tham chiếu đến một chuỗi khác (có thể là yêu cầu khóa/mở khóa mới). Ít nhất là NPTL của glibc được biết là thể hiện hành vi này.
- 1. Điều gì sẽ xảy ra khi tham chiếu C++ rời khỏi phạm vi của nó?
- 2. điều gì đã xảy ra với syscalls.h?
- 3. Điều gì đã xảy ra với regtlibv12?
- 4. Điều gì đã xảy ra với NVD3?
- 5. Điều gì sẽ xảy ra với chuỗi công nhân web HTML5 khi tab được đóng khi nó đang chạy?
- 6. .NET Mutex trên nền tảng Windows: Điều gì sẽ xảy ra với họ sau khi tôi hoàn thành?
- 7. Điều gì sẽ xảy ra với tác vụ khi nó bị hủy?
- 8. Điều gì sẽ xảy ra khi ném ngoại lệ C++?
- 9. Điều gì sẽ xảy ra nếu tôi ReleaseMutex() hai lần?
- 10. Điều gì đã từng xảy ra với deltree và sự thay thế của nó là gì?
- 11. Điều gì sẽ xảy ra sau khi gói bị bắt?
- 12. Điều gì sẽ xảy ra khi mongodb hết bộ nhớ?
- 13. Điều gì sẽ xảy ra khi Stack và Heap Collide
- 14. Điều gì sẽ xảy ra khi tôi biên dịch?
- 15. Điều gì sẽ xảy ra với AsyncTasks sau onPause?
- 16. Điều gì sẽ xảy ra khi va chạm băm xảy ra trong khóa Từ điển?
- 17. Python + JSON, điều gì đã xảy ra với Không?
- 18. Điều gì đã xảy ra với startx trên Cygwin?
- 19. Điều gì đã xảy ra với biến môi trường TMP?
- 20. Điều gì đã xảy ra với Android AAPT?
- 21. Sử dụng pin, điều gì sẽ xảy ra?
- 22. Điều gì sẽ xảy ra với các chủ đề khác khi một nhánh()?
- 23. Điều gì đã xảy ra với Project Volta?
- 24. Điều gì đã xảy ra với JSDT của Eclipse?
- 25. HttpClient 4 - Điều gì đã xảy ra với MultiThreadedHttpConnectionManager?
- 26. Điều gì sẽ xảy ra khi Java Compiler thấy nhiều chuỗi nối trong một dòng?
- 27. Điều gì sẽ xảy ra khi quyền được tắt với tính năng mới của OS 4.3?
- 28. Điều gì đã từng xảy ra với XPathReader
- 29. Điều gì đã xảy ra với java của emacs?
- 30. Điều gì đã xảy ra với types.ClassType trong python 3?
Merci Beaucoup !!! Cảm ơn rất nhiều !!! – Sadish
Chủ đề khác không thể mở khóa trừ khi đó là một mutex mạnh mẽ. –
Whoa, một 'mutex' không có ái lực với chủ đề? Không có trạng thái lỗi "bị bỏ rơi"? –