Dễ bay hơi sẽ giải quyết được sự cố của bạn, ví dụ: nó sẽ đảm bảo tính nhất quán trong tất cả các bộ đệm của hệ thống. Tuy nhiên nó sẽ không hiệu quả vì nó sẽ cập nhật biến trong bộ nhớ cho mỗi truy cập R hoặc W. Bạn có thể concider bằng cách sử dụng một rào cản bộ nhớ, chỉ khi nào nó là cần thiết, thay vào đó. Nếu bạn đang làm việc với hoặc gcc/icc có cái nhìn về đồng bộ hóa được xây dựng-in: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
EDIT (chủ yếu là về bình luận pm100): Tôi hiểu rằng niềm tin của tôi không phải là một tài liệu tham khảo vì vậy tôi tìm thấy một cái gì đó để báo giá :)
Từ khóa dễ bay hơi được tạo ra để ngăn tối ưu hóa trình biên dịch có thể hiển thị mã không chính xác trong sự hiện diện của các sự kiện không đồng bộ nhất định.Ví dụ,nếu bạn khai báo một biến nguyên thủy như không ổn định, trình biên dịch không được phép cache nó trong một thanh ghi
Từ Dr Dobb's
Thú vị hơn:
lĩnh vực dễ bay hơi là linearizable. Đọc một lĩnh vực dễ bay hơi giống như mua một cái khóa; bộ nhớ làm việc bị vô hiệu và giá trị hiện tại của trường dễ bay hơi được đọc lại từ bộ nhớ. Viết một trường dễ bay hơi giống như giải phóng một khóa: trường biến động được ghi lại ngay lập tức vào bộ nhớ. (điều này là tất cả về tính nhất quán, không phải về số nguyên tử)
từ The Art of lập trình đa, Maurice Herlihy & Nir Shavit
Khóa chứa mã đồng bộ hóa bộ nhớ, nếu bạn không khóa, bạn phải làm điều gì đó và sử dụng từ khóa dễ bay hơi có lẽ là điều đơn giản nhất bạn có thể làm (ngay cả khi nó được thiết kế cho các thiết bị bên ngoài có bộ nhớ gắn với không gian địa chỉ, nó không phải là điểm ở đây)
Điều gì khiến bạn nghĩ rằng viết sẽ là nguyên tử? – bmargulies
Tôi không có chuyên gia về đa luồng, nhưng tôi sẽ luôn thực hiện khóa xung quanh bất kỳ tài nguyên được chia sẻ nào ... –
Tôi đã thực hiện loại điều này trên bộ xử lý lõi đơn PowerPC được nhúng và nó hoạt động đáng tin cậy. Tốt hơn không làm bất kỳ đọc-sửa-ghi (chẳng hạn như '++ sharedInt') nếu nó có thể là hai chủ đề có quyền ghi. (Trên thực tế, nếu hai chủ đề có thể viết, nó có thể chỉ hữu ích nếu bạn giới hạn ** khi ** họ có thể viết. Ví dụ, thread A được phép thay đổi 'sharedInt' từ 0 đến 1 trong khi thread B được phép thay đổi nó từ 1 0.) – Dan