Điểm mấu chốt của toàn bộ cuộc thảo luận này là sự liên kết thích hợp, được devined trong phân vùng I của xxx, trong phần '12.6.2 Alignment
':
Built-in datatypes shall be properly aligned, which is defined as follows:
• 1-byte, 2-byte, and 4-byte data is properly aligned when it is stored at
a 1-byte, 2-byte, or 4-byte boundary, respectively.
• 8-byte data is properly aligned when it is stored on the same boundary
required by the underlying hardware for atomic access to a native int.
Về cơ bản, tất cả các giá trị 32-bit có sự liên kết cần thiết, và trên một nền tảng 64 bit, các giá trị 64 bit cũng có sự liên kết bắt buộc.
Lưu ý mặc dù: Có các thuộc tính để thay đổi rõ ràng bố cục lớp trong bộ nhớ, điều này có thể khiến bạn mất liên kết này. Đây là những thuộc tính cụ thể cho mục đích này, vì vậy, trừ khi bạn đã đặt ra để thay đổi cách bố trí, điều này sẽ không áp dụng cho bạn.
Với cách đó, mục đích của lớp Interlocked
là cung cấp các hoạt động (để diễn giải) chỉ có thể được quan sát thấy trong trạng thái 'trước' hoặc 'sau' của chúng. Các hoạt động liên khóa thường chỉ quan tâm khi sửa đổi bộ nhớ (thường là trong một số kiểu so sánh không trao đổi tầm thường). Khi bài viết MSDN bạn tìm thấy cho biết, các hoạt động đọc (khi được căn chỉnh đúng) có thể được coi là nguyên tử ở mọi thời điểm mà không cần đề phòng thêm.
Có những cân nhắc tuy nhiên khác khi giao dịch với các hoạt động đọc:
- Trên các CPU hiện đại, mặc dù đọc có thể nguyên tử, nó cũng có thể trả về giá trị sai từ một bộ nhớ cache cũ ở đâu đó ... đây là nơi bạn có thể cần phải làm cho trường 'biến động' để có được hành vi mà bạn mong đợi
- Nếu bạn đang xử lý giá trị 64 bit trên phần cứng 32 bit, bạn có thể cần sử dụng thao tác
Interlocked.Read
để đảm bảo toàn bộ 64 -giá trị bit được đọc trong một hoạt động nguyên tử duy nhất (nếu không nó có thể được thực hiện như 2 lần đọc 32 bit riêng biệt có thể là fro m hoặc một bên của bản cập nhật bộ nhớ)
- Việc sắp xếp lại các lần đọc/ghi của bạn có thể khiến bạn không nhận được giá trị bạn mong đợi; trong trường hợp này một số rào cản bộ nhớ có thể cần thiết (hoặc rõ ràng, hoặc thông qua việc sử dụng các hoạt động
Interlocked
lớp)
ngắn tóm tắt; theo như nguyên tử đi, rất có khả năng những gì bạn đang làm không cần bất kỳ hướng dẫn đặc biệt nào để đọc ... tuy nhiên có thể có những thứ khác bạn cần phải cẩn thận, tùy thuộc vào chính xác bạn đang làm gì.
Đối với biến động bạn có dòng Thread.VolatileRead. –
@JS: Có lý do cụ thể nào bạn khuyên InterlockedCompareExchange64 (với sự nhấn mạnh trên 64) không? Interlocked.Read cũng làm việc với các giá trị 64 bit và nói rằng "Phương thức đọc không cần thiết trên các hệ thống 64 bit", có nghĩa là InterlockedCompareExchnage (phiên bản 32 bit) không cần thiết khi đọc các giá trị 32 bit trên máy 32 bit. –
@Remus: Tốt điểm về Thread.VolatileRead, mặc dù tài liệu ngụ ý rằng bạn không cần phải lo lắng * ở tất cả * (thay vì trỏ đến Thread.VolatileRead, mà sẽ có ý nghĩa hơn). @Sause: Không có lý do cụ thể để chọn phiên bản 64 bit, không. Tôi nghĩ rằng có đủ tinh tế ở đây mà tôi không muốn yêu cầu chính xác những gì cần thiết khi cố gắng để có được đi mà không làm bất kỳ điều này. –