2010-12-12 34 views

Trả lời

14

không. Các mutex vẫn bị khóa. Điều gì thực sự xảy ra với một khóa như vậy phụ thuộc vào loại của nó, Bạn có thể đọc về điều đó here hoặc here

+0

Merci Beaucoup !!! Cảm ơn rất nhiều !!! – Sadish

+0

Chủ đề khác không thể mở khóa trừ khi đó là một mutex mạnh mẽ. –

+0

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"? –

10

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.

Các vấn đề liên quan