Tôi có một biến số int foo
được truy cập từ hai luồng. Giả sử tôi không có vấn đề về chủng tộc (truy cập được bảo vệ bởi một mutex, tất cả các hoạt động đều là nguyên tử, hoặc bất kỳ phương pháp nào khác để bảo vệ khỏi điều kiện chủng tộc), vẫn còn vấn đề "đăng ký bộ nhớ đệm" (vì thiếu tên tốt hơn) , nơi trình biên dịch có thể giả định rằng nếu biến được đọc hai lần mà không được viết ở giữa, nó là giá trị như nhau, và như vậy có thể "tối ưu hóa" mọi thứ đi như:`volatile` để đồng bộ biến giữa các chủ đề
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
hoặc
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
không đánh dấu foo
là volatile
giải quyết vấn đề này? Các thay đổi từ một luồng có được đảm bảo để đạt được luồng khác không?
Nếu không, còn cách nào khác để thực hiện việc này? Tôi cần một giải pháp cho Linux/Windows (có thể là các giải pháp riêng biệt), không có C++ 11.
Tôi nhớ nhìn thấy một trích dẫn từ tiêu chuẩn nói rằng bạn không phải sử dụng dễ bay hơi cho các chủ đề nữa, trong C++, tôi sẽ cố gắng tìm nó – aaronman
http: // stackoverflow.com/questions/4557979/khi-to-sử dụng-dễ bay hơi-với-đa luồng –
Vấn đề ở đây là "Giả sử tôi không có vấn đề chủng tộc-điều kiện". Đó là một giả định ** ENORMOUS **. –