Một trùng lặp được đạo diễn ở đây, và điều này cần một bản cập nhật. Ngôn ngữ C11 “mới” cho phép thuộc tính nguyên tử thừa nhận rằng:
_Atomic int a;
...
a += 3
có thể được biên dịch thành vòng lặp không có nguyên tử. Cảm ơn những người tiêu chuẩn quà tặng, tôi thực sự mong bạn không có.
1: trong một số kiến trúc, hoạt động nguyên tử chỉ có thể thực hiện trên bộ nhớ hỗ trợ các giao thức truy cập nhất định. Ví dụ: ARMv7, MIPS chuyển chuỗi thành:
do {
x = LoadLinked(a) + 3;
} while !StoreConditional(x, &a);
nhưng LoadLinked/StoreĐiều kiện không xác định đối với một số loại bộ nhớ/bộ nhớ cache. Thưởng thức gỡ lỗi đó.
2: liên quan là chia sẻ sai là một tạo tác của LoadLinked, StoreConditional hoạt động trên các dòng bộ nhớ cache (ví dụ 32, 64, 256 byte) không phải khối phụ. Vì vậy: _Atomic int a [4]; có thể yêu cầu 4 * kích thước dòng bộ nhớ cache (do đó 1024 byte) để cho phép đồng thời hoạt động nguyên tử đồng thời trên [n] và [n + 1], vì 4 cpu có thể bị mờ để cập nhật [0..3], nhưng không bao giờ thành công.
Hy vọng tiêu chuẩn tiếp theo sẽ nhận ra sự thất bại vốn có của trang trí thuộc tính và khôi phục c89 làm chuẩn C đúng.
ARM nào? Kiến trúc v6 (ARM10) và sau đó có thể cung cấp các hoạt động nguyên tử, nếu trình biên dịch hỗ trợ nó hoặc bạn cuộn lắp ráp của riêng bạn. Kiến trúc trước đó không thể. –
gcc đã tích hợp hoạt động nguyên tử: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html#Atomic-Builtins; xin lưu ý: "Không phải tất cả các hoạt động đều được hỗ trợ bởi tất cả các bộ vi xử lý đích" – Christoph
có API Windows để truy cập biến khóa liên động: http://msdn.microsoft.com/en-us/library/ms684122%28v=VS.85%29.aspx –