2012-09-16 42 views
5

Nếu một luồng A sinh ra một luồng B khác với mục đích duy nhất là ghi vào một biến V và sau đó chờ nó chấm dứt, các rào cản bộ nhớ có cần thiết để đảm bảo rằng các lần đọc tiếp theo của V trên luồng A có tươi không? Tôi không chắc chắn nếu có bất kỳ rào cản ngầm trong các hoạt động chấm dứt/tham gia mà làm cho họ thừa.Các rào cản bộ nhớ có cần thiết khi tham gia vào một chuỗi không?

Dưới đây là một ví dụ:

public static T ExecuteWithCustomStackSize<T> 
    (Func<T> func, int stackSize) 
{ 
    T result = default(T); 

    var thread = new Thread(
     () => 
       { 
        result = func(); 
        Thread.MemoryBarrier(); // Required? 
       } 
     , stackSize); 

    thread.Start(); 
    thread.Join(); 

    Thread.MemoryBarrier(); // Required? 
    return result; 
} 

đang là một trong hai/cả hai (hoặc nhiều hơn) trong những rào cản trong đoạn mã trên yêu cầu?

+4

Tôi nghi ngờ là rào cản bộ nhớ là bắt buộc. Nếu họ là sau đó Thread.Join sẽ là khá vô dụng và rất nhiều người sẽ gặp rắc rối. Tham gia chờ cho đến khi kết thúc chuỗi, bao gồm việc gán giá trị cho biến đó. – Despertar

+0

Xem chủ đề này: http://stackoverflow.com/questions/6581848/memory-barrier-generators – Laurijssen

Trả lời

0

Từ các tài liệu có vẻ như họ không bắt buộc -

MemoryBarrier được yêu cầu chỉ trên các hệ thống đa xử với đặt hàng bộ nhớ yếu (ví dụ, một hệ thống sử dụng nhiều bộ xử lý Intel Itanium).

Đối với hầu hết các mục đích, câu lệnh khóa C#, câu lệnh Visual Basic SyncLock hoặc lớp Monitor cung cấp các cách dễ dàng hơn để đồng bộ hóa dữ liệu.

Vì bạn đang chặn tham gia, việc này thậm chí còn không cần thiết nữa.

0

Bạn không cần rào cản bộ nhớ đầu tiên. Bạn chỉ cần gọi cho họ trước khi truy cập dữ liệu đã được sửa đổi trong một chuỗi riêng biệt. Vì bạn không làm như vậy bên trong 'chuỗi', bạn không cần cuộc gọi.

Bạn có thể loại bỏ tùy chọn thứ hai nếu bạn có kế hoạch giữ cuộc gọi Tham gia. Nếu bạn giữ cuộc gọi thứ hai, bạn có thể thoát khỏi Tham gia.

3

Không, cơ chế đồng bộ tạo ra hàng rào bộ nhớ ngầm. Tất cả dữ liệu được sửa đổi bởi một chuỗi sẽ hiển thị sau khi chuỗi được nối.

+1

Cảm ơn câu trả lời của bạn. Bất kỳ tài liệu để sao lưu này lên? – Ani

+1

@Ani: Trong nguồn này: http://www.albahari.com/threading/part4.aspx (mà mọi người đều biết bây giờ), họ đề cập đến hầu như mọi cơ chế đồng bộ hóa khi tạo ra một hàng rào. Họ không đề cập rõ ràng 'Tham gia', nhưng vì nó đặt chuỗi gọi trong trạng thái giống như' Monitor.Wait', ví dụ, đó là một gợi ý mạnh mẽ nó cũng nên tạo ra một hàng rào. Hơn nữa, chờ đợi trên một 'Task' cũng được đề cập. Mặc dù tham gia một luồng có một chút khác biệt, tôi hy vọng nó sẽ cung cấp cùng một sự bảo đảm thứ tự bộ nhớ. – Tudor

+0

Tôi đã đọc nó, nhưng không chắc chắn rằng đó là kết luận từ, như bạn nói, nó đã không đề cập rõ ràng 'Tham gia'. – Ani

Các vấn đề liên quan