2010-06-29 43 views
10

Trong nhiều tài liệu MSDN, điều này được viết dưới tiêu đề An toàn Chủ đề;msdn: "An toàn chủ đề" là gì?

"Mọi thành viên tĩnh công cộng (Được chia sẻ trong Visual Basic) thuộc loại này đều an toàn. Bất kỳ thành viên nào không được đảm bảo an toàn chỉ." Ví dụ:

; here

ai đó có thể giải thích nó một cách khá đơn giản? Cảm ơn bạn :)

Trả lời

11

Eric Lippert có số xuất sắc blog post về điều này. Về cơ bản nó hơi vô nghĩa một mình.

Cá nhân tôi không tin tưởng MSDN quá nhiều vào mặt trận này, khi tôi thấy rằng nồi hơi tấm. Nó không luôn luôn có nghĩa là những gì nó nói. Ví dụ, nó nói cùng một điều về Encoding - mặc dù thực tế rằng tất cả chúng ta sử dụng mã hóa từ nhiều chủ đề trên khắp nơi.

Trừ khi tôi có bất kỳ lý do nào để tin khác (tôi làm với Encoding) Tôi giả sử rằng tôi có thể gọi bất kỳ thành viên tĩnh nào từ bất kỳ chủ đề nào không tham nhũng trạng thái toàn cầu. Nếu tôi muốn sử dụng dụ thành viên của cùng một đối tượng từ các luồng khác nhau, tôi cho rằng điều đó là ổn nếu tôi đảm bảo - thông qua khóa - chỉ một chuỗi sẽ sử dụng đối tượng tại một thời điểm. (Đó không phải luôn luôn như vậy, tất nhiên. Một số đối tượng có mối quan hệ chủ đề và chủ động không thích được sử dụng từ nhiều chủ đề, ngay cả khi khóa tại chỗ. Điều khiển giao diện người dùng là ví dụ rõ ràng.)

Tất nhiên, nó trở nên phức tạp nếu các đối tượng được chia sẻ một cách không rõ ràng - nếu tôi có hai đối tượng chia sẻ một tham chiếu đến phần thứ ba, thì tôi có thể sử dụng hai đối tượng đầu tiên độc lập với các luồng khác nhau, với tất cả khóa thích hợp - nhưng vẫn bị hỏng đối tượng thứ ba .

Nếu loại làm quảng cáo chính nó thành chuỗi an toàn, tôi hy vọng nó sẽ cung cấp một số chi tiết về nó.Thật dễ dàng nếu nó không thay đổi được - bạn chỉ có thể sử dụng các cá thể mà bạn thích mà không phải lo lắng về chúng. Đó là một phần hoặc toàn bộ các loại "an toàn chỉ" có thể thay đổi được khi chi tiết quan trọng.

+3

Ghi chú nhỏ của MS có nghĩa là, "Chúng tôi đã không thực hiện nhiều/khóa bất kỳ trong các phương pháp thể hiện [có thể vì lý do hiệu suất]. Vì vậy, nếu bạn đi và sic một tá chủ đề trên đó, và nó messes lên, don ' t đến khóc với chúng tôi. Nó không phải là một lỗi. Và chúng tôi đã cảnh báo bạn. " – cHao

+1

@cHao: Có * nhiều hơn * để nhận đa luồng hơn là chỉ gắn một khóa trên các phương thức thể hiện. Bạn thường muốn thực hiện một chuỗi * toàn bộ các cuộc gọi phương thức hoạt động một cách nguyên tử - không có số lượng khóa nội bộ nào sẽ giúp ích trong trường hợp đó. Lặp lại thông qua một bộ sưu tập là một ví dụ rõ ràng. –

+0

@Jon: Đồng ý, có rất nhiều thứ khác. Nhưng không có nhiều hơn nữa ở tất cả những gì có thể được mong đợi của MS, như được xây dựng trong atomicity trên nhiều cuộc gọi phương pháp thậm chí không có ý nghĩa từ bất cứ ai giá trị sự ổn định. (Nó yêu cầu tài liệu API có nội dung như "Nếu bạn gọi IsEmpty() và trả về false, bạn PHẢI gọi Remove() hoặc ReleaseLock() để tránh deadlocks".) Và ngay cả trong một phương thức, nó có thể gây ra vấn đề hiệu suất nếu nó được sử dụng không cần thiết. Vì vậy, MS đúng không bận tâm. Đó là quan điểm của tôi. – cHao

5

Bạn có thể truy cập bất kỳ thành viên tĩnh công khai nào của lớp đó từ nhiều chủ đề cùng một lúc và không làm gián đoạn trạng thái của lớp. Nếu nhiều chủ đề cố truy cập đối tượng bằng cách sử dụng các phương thức mẫu (các phương thức đó không được đánh dấu là "tĩnh") cùng một lúc, đối tượng đó có thể bị hỏng.

Lớp học là "an toàn chỉ" nếu cố gắng truy cập cùng một thể hiện của lớp từ nhiều chủ đề cùng lúc không phải là gây ra sự cố.

4

Một đối tượng là "chủ đề an toàn" có nghĩa là nếu hai chủ đề đang sử dụng nó tại (hoặc rất gần, trên hệ thống đơn CPU) chính xác cùng một lúc, không có cơ hội bị hỏng bởi truy cập nói trên. Điều đó thường đạt được bằng cách mua và nhả ổ khóa, có thể gây tắc nghẽn, vì vậy "thread safe" cũng có thể có nghĩa là "chậm" nếu nó được thực hiện khi nó không cần thiết.

Thành viên tĩnh công cộng được dự kiến ​​sẽ chia sẻ giữa các chủ đề (Lưu ý, VB thậm chí gọi số nó "Được chia sẻ"), vì vậy các thống kê công cộng thường được tạo theo cách có thể sử dụng an toàn.

Thành viên sơ thẩm thường không an toàn bằng ren, vì trong trường hợp chung nó sẽ làm chậm mọi thứ. Nếu bạn có một đối tượng mà bạn muốn chia sẻ giữa các luồng, do đó, bạn sẽ cần phải thực hiện đồng bộ/khóa của riêng bạn.

0

Để hiểu điều này, hãy xem xét ví dụ sau. Trong mô tả MSDN của lớp .net HashSet, có một phần nói về độ an toàn của luồng. Trong trường hợp của HashSet Class, MSDN nói "Bất kỳ thành viên public static (Shared in Visual Basic) nào thuộc loại này là thread an toàn. Bất kỳ thành viên cá thể nào cũng không được bảo đảm là luồng an toàn. ” Vì nguyên nhân chúng ta đều biết khái niệm về điều kiện chủng tộc và deadlocks, nhưng Microsoft muốn nói gì bằng tiếng Anh đơn giản? Nếu hai chủ đề thêm hai giá trị vào một "thể hiện" của một HashSet có một số tình huống mà chúng ta có thể nhận được số của nó là một. Nguyên nhân trong tình huống này đối tượng HashSet bị hỏng vì bây giờ chúng ta có hai đối tượng trong HashSet, nhưng số đếm của nó chỉ hiển thị một đối tượng. Tuy nhiên, phiên bản tĩnh công cộng của HashSet sẽ không bao giờ phải đối mặt với một tham nhũng như vậy ngay cả khi hai luồng đồng thời thêm các giá trị.

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