Mutexes là các nút điều khiển cấp hệ điều hành. Họ sẽ nhận được đóng lại khi quá trình của bạn không (nếu bạn không đóng chúng sớm hơn, đó là.)
chỉnh sửa
Ok, tôi hiểu lầm rõ ràng ví dụ và câu hỏi. Nếu bạn chỉ đang cố gắng phát hiện liệu một cá thể khác có tồn tại hay không, bạn sẽ tạo một mutex có tên (hoặc đối tượng tương tự) và chỉ cần kiểm tra sự tồn tại của nó mà không bao giờ khóa nó.
Gọi tới WaitOne
khóa trên đó, lấy quyền sở hữu, trong khi ReleaseMutex
loại bỏ nó (miễn là không có cuộc gọi bổ sung nào tới WaitOne
). Nếu bạn kết thúc chủ đề mà không phát hành đầy đủ mutex, nó không để đối tượng ở trạng thái xấu, như được giải thích trong trích dẫn văn bản Micah.
Tôi đã đặt câu hỏi của bạn là về việc bạn đóng xử lý trước khi quá trình hoàn tất, đó là một điều hoàn toàn khác.
thêm
Tại SDK [API] [1] cấp độ, bạn có thể gọi CreateMutex
với kỳ vọng của thất bại khi một mutex cùng tên đã được tạo ra. Trong .NET (tốt, trong 4.0, ít nhất), có một [hàm tạo] [2] điền vào một bool createdNew
.
[1]: http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx CreateMutex
[2]: http://msdn.microsoft.com/en-us/library/bwe34f1k(v=VS.90).aspx Mutex
Nguồn
2010-08-14 17:52:03
Các mutex được đặt tên thường chỉ được sử dụng để điều phối liên lạc chéo, không phải ví dụ của bạn hiển thị. –
@Steven: Sử dụng mutexes cho việc này là một cách sử dụng thực sự tốt. Tốt hơn là cố gắng để phát hiện một cửa sổ trước đó hoặc tên quá trình hoặc một cái gì đó. – erikkallen
Tôi đã cập nhật câu hỏi của mình, vì bạn đang thực hiện hai điều liên quan đến bán trong mã của mình: 1) Sử dụng mutex được đặt tên để phát hiện sự tồn tại của phiên bản trước của ứng dụng của bạn 2) Đồng bộ hóa giữa các quá trình với mutex đó. –