Giản câu hỏi để cung cấp cho một đại diện rõ ràng hơn về những gì tôi đang thực sự yêu cầumảng của các đối tượng, cập nhật trong một thread và đọc trong một
Tôi có hai chủ đề, gọi cho họ A
và B
. Họ chia sẻ một đối tượng thuộc loại Foo
có một trường được gọi là Name
và được lưu trữ trong một loại loại Foo[]
tại chỉ số 0
. Các chủ đề sẽ luôn truy cập chỉ mục 0
theo thứ tự được đảm bảo bởi hệ thống đã sẵn sàng, do đó không có điều kiện chủng tộc nào của chủ đề B
nhận trước chủ đề A
.
Đơn đặt hàng này.
// Thread A
array[0].Name = "Jason";
// Thread B
string theName = array[0].Name
Như tôi đã nói lệnh này đã được đảm bảo, có có cách nào cho thread B để đọc các giá trị trước khi sợi Một
Những gì tôi muốn đảm bảo là hai điều:
- Cả hai chuỗi đều nhận được đối tượng mới nhất tại chỉ mục 0.
- Chủ đề
B
luôn nhận giá trị mới nhất trong trường .Name
Đánh dấu Name
là dễ bay hơi không phải là một tùy chọn, vì các đối tượng thực sự phức tạp hơn nhiều và thậm chí có các cấu trúc tùy chỉnh mà thậm chí không thể có thuộc tính dễ bay hơi gắn liền với chúng.
Bây giờ, đáp ứng 1 là dễ dàng (luôn luôn nhận được đối tượng mới nhất), bạn có thể làm một .VolatileRead:
// Thread A
Foo obj = (Foo)Thread.VolatileRead(ref array[0]);
obj.Name = "Jason";
// Thread B
Foo obj = (Foo)Thread.VolatileRead(ref array[0]);
string theName = obj.Name
Hoặc bạn có thể chèn một rào cản bộ nhớ:
// Thread A
array[0].Name = "Jason";
Thread.MemoryBarrier();
// Thread B
Thread.MemoryBarrier();
string theName = array[0].Name
Vì vậy, câu hỏi của tôi là: Điều này có đủ để thỏa mãn điều kiện 2 không? Rằng tôi luôn luôn nhận được giá trị mới nhất từ các lĩnh vực của đối tượng tôi đọc ra? Nếu đối tượng tại chỉ mục 0
chưa thay đổi, nhưng Name
có. Sẽ thực hiện một số VolatileRead
hoặc MemoryBarrier
trên chỉ mục 0
đảm bảo tất cả các trường trong đối tượng tại chỉ mục 0
cũng sẽ nhận được giá trị mới nhất của chúng?
Tại sao bạn sử dụng mảng? Nhìn vào không gian tên ['System.Collections.Concurrent'] (http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx). – Oded
Không sử dụng .NET4, để bắt đầu. Và các công cụ đồng thời, theo như tôi biết, chỉ đảm bảo nội dung của các bộ sưu tập và không cho các trường/thuộc tính có thể có của các đối tượng trong bộ sưu tập. – thr
Tôi không nghĩ rằng dễ bay hơi sẽ đảm bảo những gì bạn nghĩ rằng nó sẽ. –