Tôi đã có một cuộc thảo luận với một đồng đội về việc khóa .NET. Anh ấy là một chàng trai thực sự thông minh với một nền tảng rộng lớn trong cả lập trình cấp thấp hơn và cấp cao hơn, nhưng kinh nghiệm của anh ấy với lập trình cấp thấp hơn vượt xa tôi. Dù sao, ông lập luận rằng nên tránh khóa .NET trên các hệ thống quan trọng dự kiến sẽ chịu tải nặng nếu có thể để tránh khả năng nhỏ được thừa nhận là "luồng zombie" làm sập hệ thống. Tôi thường xuyên sử dụng khóa và tôi không biết "sợi zombie" là gì, vì vậy tôi đã hỏi. Ấn tượng tôi nhận được từ lời giải thích của anh ta là một chủ đề zombie là một chủ đề đã chấm dứt nhưng bằng cách nào đó vẫn giữ một số tài nguyên. Một ví dụ ông đã đưa ra về cách một luồng zombie có thể phá vỡ một hệ thống là một luồng bắt đầu một số thủ tục sau khi khóa vào một số đối tượng, và sau đó tại một số điểm chấm dứt trước khi khóa có thể được phát hành. Tình huống này có khả năng làm sập hệ thống, vì cuối cùng, các nỗ lực thực thi phương thức đó sẽ dẫn đến tất cả các luồng đang chờ truy cập vào một đối tượng sẽ không bao giờ được trả về, vì luồng đang sử dụng đối tượng bị khóa đã chết.
Tôi nghĩ rằng tôi đã nắm được ý chính của vấn đề này, nhưng nếu tôi không có cơ sở, xin vui lòng cho tôi biết. Khái niệm này có ý nghĩa với tôi. Tôi đã không hoàn toàn tin rằng đây là một kịch bản có thể xảy ra trong .NET. Trước đây tôi chưa bao giờ nghe nói về "thây ma", nhưng tôi nhận ra rằng các lập trình viên đã làm việc chuyên sâu ở các cấp thấp hơn có xu hướng hiểu sâu hơn về các nguyên tắc tính toán cơ bản (như phân luồng). Tôi chắc chắn thấy giá trị trong khóa, tuy nhiên, và tôi đã thấy nhiều lập trình viên đẳng cấp thế giới tận dụng khóa. Tôi cũng có khả năng hạn chế để đánh giá điều này cho bản thân mình vì tôi biết rằng lock(obj)
tuyên bố thực sự chỉ là cú pháp cú pháp cho:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
và bởi vì Monitor.Enter
và Monitor.Exit
được đánh dấu extern
. Có vẻ như .NET có thể xử lý một số loại xử lý bảo vệ các luồng khỏi tiếp xúc với các thành phần hệ thống có thể gây ra tác động này, nhưng đó hoàn toàn là suy đoán và có lẽ chỉ dựa trên thực tế là tôi chưa bao giờ nghe nói về "các luồng zombie" trước. Vì vậy, tôi hy vọng tôi có thể nhận được một số phản hồi về điều này ở đây:
- Có một định nghĩa rõ ràng hơn về một "chủ đề zombie" so với những gì tôi đã giải thích ở đây?
- Chủ đề zombie có thể xảy ra trên .NET? (Tại sao tại sao không?)
- Nếu có thể, Làm thế nào tôi có thể buộc tạo ra một chuỗi zombie trong .NET?
- Nếu có thể, Làm cách nào tôi có thể tận dụng khóa mà không gặp rủi ro trong kịch bản luồng zombie trong .NET?
Cập nhật
Tôi đã hỏi câu hỏi này hơn một hai năm trước. Hôm nay điều này đã xảy ra:
wait
hoặc waitpid
. Quá trình con sau đó được gọi là "quá trình zombie". Xem thêm howtogeek.com/119815