"Chủ đề an toàn" là một phần của thuật ngữ không may vì nó không thực sự có định nghĩa vững chắc. Về cơ bản nó có nghĩa là một số hoạt động trên đối tượng được đảm bảo hoạt động hợp lý khi đối tượng đang được vận hành trên nhiều luồng.
Hãy xem xét ví dụ đơn giản nhất: bộ đếm. Giả sử bạn có hai luồng đang tăng bộ đếm. Nếu chuỗi sự kiện diễn ra:
- Chủ đề đọc từ quầy, được không.
- Chủ đề hai lần đọc từ bộ đếm, được không.
- Tạo một số không, viết một lượt truy cập.
- Thêm hai số không, viết một lượt truy cập.
Sau đó, hãy lưu ý cách bộ đếm đã "mất" một trong các số gia. Hoạt động gia tăng đơn giản trên các quầy không phải là luồng an toàn; để làm cho chúng an toàn, bạn có thể sử dụng khóa hoặc InterlockedIncrement.
Tương tự với hàng đợi. Các luồng không phải luồng-chủ đề có thể "mất" enqueues giống như cách mà các quầy không phải là luồng an toàn có thể mất các gia số. Tồi tệ hơn, không phải hàng đợi an toàn chủ đề thậm chí có thể sụp đổ hoặc tạo ra kết quả điên rồ nếu bạn sử dụng chúng trong một tình huống đa luồng không đúng cách.
Khó khăn với "chủ đề an toàn" là nó không được xác định rõ ràng. Liệu nó có nghĩa đơn giản là "sẽ không sụp đổ"? Điều đó có nghĩa là các kết quả hợp lý sẽ được tạo ra? Ví dụ: giả sử bạn có bộ sưu tập "chủ đề an toàn". Mã này có đúng không?
if (!collection.IsEmpty) Console.WriteLine(collection[0]);
Không. Ngay cả khi bộ sưu tập là "chủ đề an toàn", điều đó không có nghĩa là mã này là chính xác; một chủ đề khác có thể đã làm cho bộ sưu tập trống sau khi kiểm tra nhưng trước khi các văn bản và do đó mã này có thể sụp đổ, ngay cả khi đối tượng được cho là "threadsafe". Trên thực tế xác định rằng mọi kết hợp có liên quan hoạt động là luồng an toàn là một vấn đề vô cùng khó khăn.
Bây giờ, hãy đến với tình huống thực tế của bạn: bất cứ ai nói với bạn "bạn nên sử dụng lớp Queue, tốt hơn vì nó là chủ đề an toàn" có lẽ không có ý tưởng rõ ràng về những gì họ đang nói. Trước hết, Hàng đợi không phải là chủ đề an toàn. Thứ hai, cho dù Queue là threadafe hay không là hoàn toàn không liên quan nếu bạn chỉ sử dụng các đối tượng trên một thread duy nhất! Nếu bạn có một bộ sưu tập sẽ được truy cập trên nhiều luồng, thì như tôi đã chỉ ra trong ví dụ trên, bạn có một vấn đề cực kỳ khó giải quyết, bất kể bản thân bộ sưu tập có phải là "threadsafe" hay không. Bạn phải xác định rằng mọi kết hợp hoạt động bạn thực hiện trên bộ sưu tập cũng là an toàn. Đây là một vấn đề rất khó khăn, và nếu nó là một trong những bạn phải đối mặt, sau đó bạn nên sử dụng các dịch vụ của một chuyên gia về chủ đề khó khăn này.
Nguồn
2009-10-12 04:09:03
+1 Đối với lời khai chuyên gia vững chắc. Bạn cũng đúng để chỉ ra rằng "thread an toàn" là một khái niệm khá mờ. –
Tôi thích cách mọi câu hỏi liên quan đến chuỗi an toàn được trả lời bởi cùng một anh chàng, mà tôi đã đọc từ khoảng 2 giờ. –