Việc thực hiện Volatile.Read
chỉ chèn một rào cản bộ nhớ sau khi đọc:Tại sao Volatile.Read lấy tham số ref?
public static int Read(ref int location)
{
var value = location;
Thread.MemoryBarrier();
return value;
}
Do đó, việc sử dụng các phương pháp như vậy ...
return Volatile.Read(ref _a) + Volatile.Read(ref _b);
... sẽ tương đương với:
var a = _a;
Thread.MemoryBarrier();
var b = _b;
Thread.MemoryBarrier();
return a + b;
Cho ở trên, hành vi kết quả sẽ không giống nhau nếu tham số không phải là ref
?
public static int Read(int value)
{
Thread.MemoryBarrier();
return value;
}
Tôi đoán rằng tham số ref
đã được sử dụng chỉ đơn giản là để ngăn chặn các lập trình viên từ đi qua những thứ khác hơn biến, chẳng hạn như Volatile.Read(2 + 3)
. Ai có thể thấy bất kỳ lý do nào khác cho số ref
khi các biến được chuyển vào không?
Vì nếu không bạn đang đọc một bản sao? –
Có, nhưng điều đó có quan trọng không? Không phải rào cản bộ nhớ vẫn được chèn vào giữa việc đọc bản gốc và cách sử dụng tiếp theo của nó? – Douglas