2009-09-29 57 views
7

Tài liệu của Microsoft là im lặng về những gì sẽ xảy ra nếu tôi nhầm lẫn gọi ReleaseMutex() khi mutex đã được mở khóa.Điều gì sẽ xảy ra nếu tôi ReleaseMutex() hai lần?

chi tiết:

Tôi đang cố gắng để sửa chữa một số mã Windows mà không cần phải truy cập vào trình biên dịch.

Tôi nhận ra rằng các đột biến WinApi đều là đệ quy và được tính tham chiếu. Nếu tôi đang sử dụng tính năng đó, rõ ràng là cuộc gọi thêm ReleaseMutex() sẽ sớm giảm số lượt truy cập tham chiếu.

Tuy nhiên, mã mà tôi đang xem không sử dụng mutex đệ quy, do đó, số lượng tham chiếu không bao giờ cao hơn '1'. Nó không phát hành mutex nhiều lần hơn mức cần thiết ... vậy điều gì sẽ xảy ra? Số lượng tham chiếu có bị âm không? Liệu nó ở lại ở số không (mở khóa) và chỉ trả lại một lỗi đáng nhớ?

(Đương nhiên, mã này không thực sự kiểm tra lỗi khi nó gọi các chức năng này!)

+0

Đây là một câu hỏi thực sự tồi tệ. Ngay cả khi tôi sẽ biết, 'nó kiểm tra theo WinXP' nó có thể hoàn toàn khác nhau theo Win7. Vì vậy, bạn thực sự không bao giờ nên làm điều này. (NB: Tôi nghĩ rằng nó được kiểm tra) – Christopher

+5

Tài liệu không im lặng: http://msdn.microsoft.com/en-us/library/ms685066%28VS.85%29.aspx – peejaybee

+0

peejaybee, bạn nên nâng cấp bình luận cho một câu trả lời! –

Trả lời

8

peejay cung cấp một liên kết tốt trong bình luận của ông với ReleaseMutex documentation. Tôi tin rằng dòng này từ tài liệu trả lời câu hỏi của bạn:

chức năng

Các ReleaseMutex thất bại nếu chủ đề kêu gọi không sở hữu đối tượng mutex .

Trong khi nó không được nói rõ ràng, tôi nghĩ rằng việc phát hành một mutex (lần đầu tiên) khiến cho chuỗi cuộc gọi không còn sở hữu đối tượng mutex nữa. Do đó, cuộc gọi thứ hai sẽ không thành công. Việc triển khai như vậy cũng có ý nghĩa vì nó sẽ cho phép dễ dàng phát hiện loại lỗi này (Chỉ cần kiểm tra giá trị trả lại).

+0

OK, vậy lỗi nào được trả về? –

+0

"Nếu chức năng thất bại, giá trị trả về bằng không." – Bill

+0

Dưới đây là báo giá đầy đủ: "Nếu chức năng không thành công, giá trị trả về bằng 0. Để nhận thông tin lỗi mở rộng, hãy gọi GetLastError." Vì vậy, có được gọi là GetLastError(), làm thế nào tôi có thể phân biệt điều kiện lỗi này từ các lỗi khác có thể xảy ra? –

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