Tôi chỉ tự hỏi liệu một điều kiện chủng tộc xảy ra trong các mã dưới đây:Race Điều kiện trong Async/chờ đợi Mã
int readingFiles;
async Task<string> ReadFile (string file)
{
++readingFiles;
var text = await Stream.ReadFileAsync(file);
--readingFiles;
return text;
}
Nếu phương pháp ReadFile được thực hiện bởi một thread bơi, readingFiles sẽ được truy cập bởi hai chủ đề khác nhau và biến readFiles không được bảo vệ bởi bất kỳ thành phần đồng bộ hóa nào.
Điều đó có nghĩa là bản cập nhật đầu tiên cho readingFiles sẽ không được hiển thị cho chuỗi khác đang thi hành "--readingFiles". Tuy nhiên, tôi đã không bao giờ thấy rằng readingFiles bằng -1 sau "--readingFiles". Tôi kiểm tra xem các thread tương tự thực hiện các hoạt động ++ và - bằng cách sử dụng Thread.CurrentThread. Trong hầu hết các trường hợp, nó không phải là cùng một luồng và tôi vẫn không thấy readFiles là -1.
Mặc dù có điều kiện chủng tộc và readingFiles không dễ bay hơi, tại sao tôi không thấy ảnh hưởng của điều kiện chủng tộc này?
Chắc chắn toàn bộ điểm của cách thức không đồng bộ/đang chờ sử dụng ngữ cảnh đồng bộ hiện tại có nghĩa là * * là "thành ngữ đồng bộ hóa" thích hợp - bạn không thể thấy chúng. –
Thay vì '--readingFiles', hãy thử điều này:' var temp = readingFiles; Ngủ (1000); readingFiles = temp - 1; ' – Dialecticus
Bạn chỉ chạy một thể hiện của ReadFile, đúng không? – usr