2010-07-02 28 views
5

Có kịch bản, tôi có hai chủ đề đều đang sử dụng cùng một mutex. Một chủ đề đã khóa mutex và bị lỗi. Trạng thái mutex là gì? Nó vẫn bị khóa và luồng thứ hai không bao giờ sở hữu mutex đó? Có nghĩa là một tình trạng bế tắc?Chủ đề bị lỗi với khóa Mutex

Edit - Cũng giải thích một trường hợp pthread trên các hệ thống Linux

+2

Vui lòng cung cấp thêm thông tin. – InsertNickHere

Trả lời

3

Vì bạn đã không quy định những gì hệ điều hành, tôi sẽ cho bạn biết những gì xảy ra trong Win32.

Trong Win32, chuỗi thứ hai sẽ được WAIT_ABANDONED khi nó chờ đợi trên mutex thuộc sở hữu của một chuỗi đã chấm dứt. Lưu ý rằng việc nhận WAIT_ABANDONED có nghĩa là chuỗi thứ hai đã nhận được mutex, do đó sẽ không có bế tắc. Chuỗi thứ hai sẽ phát hiện kết quả WAIT_ABANDONED và xác minh rằng tài nguyên được bảo vệ bởi mutex ở trạng thái hợp lệ. Nếu nó có thể phát hiện tham nhũng và không phát hiện bất kỳ lỗi nào, thì việc tiếp tục là an toàn. Nếu không, đó là một ý tưởng tốt để nâng cao lỗi của một số loại.

Với một số triển khai của một mutex không có cách nào để phát hiện rằng chuỗi sở hữu nó đã chấm dứt và bạn kết thúc bằng một bế tắc.

Với một số triển khai của một mutex có một cách để phát hiện chuỗi chủ sở hữu là gì, hãy chỉ ra rằng chuỗi sở hữu đã chấm dứt và sau đó sở hữu mutex.

+1

trong một số triển khai, bạn có thể xác định thời gian chờ hoặc bạn tạo phương thức trình bao bọc của riêng mình ... dù sao, việc tạm dừng chuỗi không có hiệu lực đối với mutex \ semaphore trong việc triển khai cổ điển nên bạn nên kiểm tra thời gian chờ đợi và tăng thời gian chờ hoặc tiếp tục thực hiện. – Oleksandr

+0

Xin lỗi vì một nửa câu hỏi. Đây là trên hệ điều hành Windows và cũng muốn biết hành vi của hệ điều hành khác. Gabe: Nếu luôn luôn nhận được WAIT_ABANDONED thì có thể dễ dàng xử lý. Một lần nữa, có bế tắc? Cách chúng tôi phát hiện chuỗi chủ sở hữu đã bị lỗi. Joonas Pulakka: Chỉ giả định chuỗi bị lỗi với NULL. Có nghĩa là không có ngoại lệ hoặc không phải bất kỳ sự thừa nhận nào. – CrazyC

2

Đó chắc chắn phụ thuộc vào (ít nhất) hai điều:

  • Làm thế nào mutex được thực hiện, và
  • Làm thế nào các tai nạn chủ đề (nó ném một ngoại lệ, hay nó chỉ là "biến mất") .

Ví dụ: trong các khối synchronized của Java được đảm bảo được giải phóng khi "chuỗi được thực hiện với đối tượng" - bất kể điều đó có nghĩa là gì (xem link). Theo this bài viết:

Dừng một chuỗi làm cho nó mở khóa tất cả các màn hình đã khóa.

Ok, stop() ing thread giải phóng màn hình, nhưng nếu chỉ bằng cách nào đó biến mất, thì "được thực hiện với đối tượng"? Tôi không thấy tài liệu này ở bất cứ đâu. Nhưng rõ ràng là một người nào đó phải phát hành các mutex bị khóa hoặc nếu không họ sẽ bế tắc; có lẽ một số mutexes hoặc môi trường bao gồm các cơ chế phát hành mutexes tự động nếu thread, người đã khóa chúng, trở nên không tồn tại.

Ví dụ khác: java.util.concurrent.Lock tài liệu khuyên bạn nên sử dụng câu lệnh finally để giải phóng khóa sao cho bất kỳ điều gì xảy ra với chuỗi thực thi, khóa sẽ được giải phóng. Tuy nhiên, nếu thread biến mất trước khi câu lệnh finally được thực thi, thì khóa không bao giờ được giải phóng và bế tắc thực sự xảy ra. Tất nhiên, chủ đề không nên "biến mất" như thế.

Khá là một câu hỏi hay!

+0

câu hỏi là tốt nhưng mỗi thực hiện có cơ chế riêng của họ và giải pháp để giải quyết vấn đề mô tả nhưng chúng tôi chỉ có thể đoán những gì tác giả có nghĩa là :) – Oleksandr

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