2010-06-15 41 views
21

Tôi biết rằng trong .Net tất cả các loại 32 bit (ví dụ: int, bool, v.v.) là chỉ an toàn. Đó là, sẽ không có một phần viết (theo các thông số kỹ thuật).Là int? chủ đề an toàn?

Nhưng, điều tương tự cũng áp dụng cho int? (không thể nhập int)?

Trả lời

38

Câu hỏi này được diễn đạt kém và do đó sự nhầm lẫn trong câu trả lời cho đến thời điểm này. Câu hỏi phải là "đang đọc và ghi vào một biến kiểu int? Đảm bảo là nguyên tử?"

Không, hoàn toàn không. Thông số kỹ thuật cực kỳ rõ ràng về điểm này:

Đọc và ghi các loại dữ liệu sau là nguyên tử: bool, char, byte, sbyte, ngắn, ushort, uint, int, float và tham chiếu. Ngoài ra, đọc và viết các loại enum với một kiểu cơ bản trong danh sách trước cũng là nguyên tử. Đọc và viết các loại khác, bao gồm dài, ulong, kép và thập phân, cũng như các loại do người dùng định nghĩa, không được đảm bảo là nguyên tử.

Hoàn toàn có thể cho một chuỗi đọc giá trị được viết một phần từ biến chia sẻ bộ nhớ của loại có thể loại bỏ.

Ví dụ: giả sử bạn có int? biến x mà hiện tại có giá trị null. Do đó nó chứa một int, được đặt thành 0 và một bool, được đặt thành false. Bây giờ trên một chủ đề khác bạn viết int vô giá "5" đến x. Nó là hoàn toàn hợp pháp cho một luồng khác để đọc số không int vô giá trị từ x, bởi vì "true" trong bool có thể được thiết lập trước khi 5 được đặt thành int.

+0

Tôi hiểu ví dụ của bạn cho int? .. nhưng tại sao lại đọc/ghi dài, gấp đôi và thập phân không phải nguyên tử? – MalcomTucker

+0

@MalcomTucker: Bộ xử lý 32 bit chỉ đảm bảo rằng các phép toán trên các biến là nguyên tử nếu chúng là 32 bit. Dài, kép và số thập phân có thể yêu cầu nhiều thao tác viết hoặc đọc toàn bộ giá trị vì chúng lớn hơn 32 bit. –

+0

@MalcolmTucker: http://msdn.microsoft.com/en-us/library/system.threading.interlocked_members.aspx cung cấp chức năng cung cấp khả năng thực hiện các phép toán nguyên tử trên đôi và các loại khác. – Brian

12

Không, vì số int? thực sự là cấu trúc (Nullable<int>) gồm intbool.

+2

@Eric: Nhưng, ngoại trừ toán tử chuyển đổi, không có thành viên tĩnh công khai nào trên 'Nullable '. – LukeH

+0

@ LukeH: điều đó có liên quan gì đến câu hỏi? –

+1

@Eric: Nhận xét của tôi là để đáp lại một bình luận trước đó (kể từ khi bị xóa) được thực hiện bởi một Eric khác, tuyên bố rằng một số thành viên của 'int?' Type - các thành viên tĩnh công cộng - an toàn thread. – LukeH

3

Từ http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx:

Bất kỳ public static (chung trong Visual Basic) thành viên của loại này là chủ đề an toàn. Bất kỳ thành viên nào trong số đều không được đảm bảo là chuỗi an toàn.

+5

Vấn đề là 'Nullable 'không có thành viên tĩnh công cộng (trừ khi bạn đếm các toán tử chuyển đổi đến/từ' T' chính nó). Đây chỉ là văn bản soạn sẵn mà bạn sẽ tìm thấy trong tài liệu hướng dẫn cho hầu hết các đối tượng trên MSDN. – LukeH

+3

Thực tế là nó là bản sao tài liệu phổ biến làm cho nó ít chính xác hơn? –

+1

..suspect trong ít nhất :) – Rusty

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