Tôi liên tục đọc từ tập tin được ánh xạ bộ nhớ mà quy trình khác đang viết và sử dụng một mutex để đồng bộ hóa thao tác này. Trong vài thử nghiệm của tôi cho đến nay điều này hoạt động tốt, nhưng ... nếu ứng dụng của tôi bị treo ngay sau khi có được mutex và trước khi phát hành nó thì sao? Có cách nào để đảm bảo một bản phát hành của mutex, ngay cả trong trường hợp của một vụ tai nạn như vậy?Xử lý "An toàn" của Mutex?
Ngoài ra làm cách nào để xử lý sự cố của quá trình khác, có thể chưa phát hành mutex? Tôi có cần xử lý AbandonedMutexException mỗi khi tôi gọi mutex.WaitOne()?
Ngay bây giờ tôi đang làm nó tương tự như sau:
public MyState GetState()
{
MyState state = new State();
this._mutex.WaitOne();
try
{
state.X = this._mmView.ReadSingle(0);
state.Y = this._mmView.ReadSingle(4);
[..]
}
finally
{
this._mutex.ReleaseMutex();
}
return state;
}
_mmView là một MemoryMappedViewAccessor tôi instantiated trước. Toàn bộ phương thức này GetState() được gọi là mỗi khung hình như là một phần của vòng lặp trò chơi, do đó, cứ mỗi vài phần nghìn giây.
PS: Ngoài ra, có bất kỳ vấn đề rõ ràng nào khác tại sao điều này có thể không thành công, mà tôi chưa đề cập đến?
"không viết chương trình đã từng gặp sự cố", hoặc, như thiền sư nói - "Tránh lỗi". Lời khuyên tuyệt vời. ahem. – mickeyf
Tuy nhiên, âm thanh không mạnh mẽ và không thực tế. Điều gì xảy ra nếu người dùng chỉ đơn giản là giết quá trình thông qua trình quản lý tác vụ, buộc phải làm hỏng ứng dụng? – Mario
@Mario: Tôi không biết bạn nghĩ gì là không thực tế; Tôi đảm bảo với bạn rằng các loại lỗi tham nhũng dữ liệu này thường xuyên bị xáo trộn và phải được bảo vệ chống lại nếu bạn quan tâm đến trạng thái dữ liệu của người dùng. Re: nếu người dùng gặp sự cố ứng dụng thì sao? Bạn đang hỏi tôi điều gì xảy ra khi người dùng thực hiện công cụ làm hỏng dữ liệu của riêng họ? ** Dữ liệu của họ bị hỏng **, đó là những gì. Người dùng không muốn dữ liệu của họ bị hỏng ** không nên gỡ xuống ứng dụng của họ **. Có một lý do * tại sao làm như vậy đặt lên một hộp thoại nói rằng "bạn có thể làm hỏng dữ liệu của bạn nếu bạn làm điều này". –