C bang # đặc tả trong mục 5.5 mà đọc và viết trên một số loại (cụ thể là bool
, char
, byte
, sbyte
, short
, ushort
, uint
, int
, float
, và tham khảo các loại) có bảo đảm là nguyên tử.Làm thế nào để đảm bảo nguyên tử của các hoạt động đọc/ghi?
Điều này đã khơi gợi sự quan tâm của tôi. Làm thế nào bạn có thể làm điều đó? Ý tôi là, kinh nghiệm cá nhân của tôi chỉ cho thấy tôi khóa các biến hoặc sử dụng các rào cản nếu tôi muốn đọc và viết để trông nguyên tử; đó sẽ là một kẻ giết người hiệu suất nếu nó phải được thực hiện cho mỗi lần đọc/ghi đơn. Tuy nhiên, C# làm một cái gì đó với một hiệu ứng tương tự.
Có lẽ các ngôn ngữ khác (như Java) làm điều đó. Tôi nghiêm túc không biết. Câu hỏi của tôi không thực sự có ý định ngôn ngữ cụ thể, nó chỉ là tôi biết C# hiện nó.
Tôi hiểu rằng nó có thể phải đối phó với một số hướng dẫn xử lý cụ thể nhất định và có thể không sử dụng được trong C/C++. Tuy nhiên, tôi vẫn muốn biết nó hoạt động như thế nào.
[EDIT] Để nói sự thật, tôi tin rằng việc đọc và ghi có thể không nguyên tử trong một số điều kiện nhất định, như CPU có thể truy cập vị trí bộ nhớ trong khi CPU khác đang viết ở đó. Điều này chỉ xảy ra khi CPU không thể xử lý tất cả đối tượng cùng một lúc, giống như vì nó quá lớn hoặc do bộ nhớ không được căn chỉnh trên ranh giới phù hợp?
Với tôi, âm thanh thực sự rõ ràng và dễ hiểu. – Dykam
Meh. Tôi bằng cách nào đó nghĩ rằng nó có thể cho một thread để truy cập vào một vị trí bộ nhớ _during_ hoạt động viết của CPU khác, dẫn đến kết quả không nhất quán. Tôi đã sai tất cả thời gian đó sao? – zneak
Có nhiều vấn đề khác hơn là đọc/ghi nguyên tử. 2 chủ đề hoạt động trên cùng một biến có thể rất tốt dẫn đến kết quả không mong muốn gây ra họ thường đọc/sửa đổi/ghi mà không phải là nguyên tử. Cũng có những vấn đề về khả năng hiển thị bộ nhớ trên các máy đa xử lý cần được chăm sóc đặc biệt – nos