2012-01-08 32 views
21

Tôi tự hỏi nếu điều này là hoàn toàn thread-an toàn và có hay không các từ khóa dễ bay hơi nên được đặt ra.Đây có phải là (bool dễ bay hơi) luôn luôn là chủ đề an toàn không?

using System.Threading; 

class Program 
{ 
    private static volatile bool _restart = true; 

    private static void Main() 
    { 
     while (_restart) 
     { 
      // Do stuff here every time for as long as _restart is true 
      Thread.Sleep(1); 
     } 
    } 

    private static void SomeOtherThread() 
    { 
     Thread.Sleep(1000); 
     _restart = false; 
    } 
} 

Tôi nghĩ là vậy, nhưng tôi muốn kiểm tra lại, vì tôi không chắc chắn 100% tôi chỉ muốn chắc chắn.

Tôi nghĩ rằng từ khóa dễ bay hơi là bắt buộc bởi vì sau đó nó sẽ không bao giờ có thể có giá trị được lưu trữ trong sổ đăng ký hoặc tối ưu hóa giống nhau.

+0

Đó không thực sự là phương tiện an toàn cho chủ đề. Thread-safe (thường) có nghĩa là nhiều cuộc gọi đến cùng một lớp/thư viện sẽ không làm mất đi dữ liệu tĩnh được lưu trữ bởi thư viện. –

+0

Trong ví dụ của bạn, nếu tất cả những gì bạn muốn làm là gắn cờ một chuỗi khác, tôi không thấy những gì sẽ không hoạt động. –

+0

@JonathonReinhart Vâng, tôi chỉ có nó như một lá cờ. Nếu đây không phải là chủ đề an toàn thì nó có đồng thời không? – Aidiakapi

Trả lời

11

Những gì SLaks trả lời là đúng, tất nhiên, nhưng để trả lời câu hỏi của bạn: có trên cả hai số: an toàn, nên được khai báo dễ bay hơi.

+0

Cảm ơn bạn, đó là những gì tôi muốn biết :) – Aidiakapi

10

Bạn nên thay thế toàn bộ cấu trúc đó bằng ManualResetEvent, cả hai đều an toàn và nhanh hơn.

private static readonly ManualResetEvent ev = new ManualResetEvent(); 

private static void Main() 
{ 
    ev.WaitOne() 
} 

private static void SomeOtherThread() 
{ 
    Thread.Sleep(1000); 
    ev.Set(); 
} 
+2

Đây là * không * những gì tôi muốn, tôi không muốn các chủ đề chính (trong trường hợp này) để ngủ. Tôi chỉ muốn nó tiếp tục lặp lại. Nếu không tôi cũng sẽ sử dụng một cấu trúc khác. Xin lỗi vì tôi chưa rõ về điều này, vui lòng xem bản cập nhật. – Aidiakapi

+0

+1 đó là tốt hơn .., tuy nhiên @Aidiakapi lưu ý rằng giải pháp của bạn sẽ hoạt động chính xác; từ khóa 'volatile' sẽ xóa giá trị mới' _restart = false' thành bộ nhớ chính và do đó giá trị cập nhật sẽ được nhìn thấy ở phương thức 'Main' của bạn .. –

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