Mối quan tâm chính của tôi là với cờ boolean ... có an toàn khi sử dụng nó mà không cần đồng bộ hóa không? Tôi đã đọc ở một số nơi mà nó nguyên tử (bao gồm cả tài liệu).Có an toàn khi sử dụng cờ boolean để ngăn chặn một luồng chạy trong C#
class MyTask
{
private ManualResetEvent startSignal;
private CountDownLatch latch;
private bool running;
MyTask(CountDownLatch latch)
{
running = false;
this.latch = latch;
startSignal = new ManualResetEvent(false);
}
// A method which runs in a thread
public void Run()
{
startSignal.WaitOne();
while(running)
{
startSignal.WaitOne();
//... some code
}
latch.Signal();
}
public void Stop()
{
running = false;
startSignal.Set();
}
public void Start()
{
running = true;
startSignal.Set();
}
public void Pause()
{
startSignal.Reset();
}
public void Resume()
{
startSignal.Set();
}
}
Đây có phải là cách an toàn để thiết kế tác vụ theo cách này không? Bất kỳ đề xuất, cải tiến, ý kiến?
Lưu ý: Tôi đã viết lớp tùy chỉnh CountDownLatch
trong trường hợp bạn tự hỏi mình đang lấy nó từ đâu.
Cập nhật:
Đây là CountDownLatch tôi quá:
public class CountDownLatch
{
private volatile int m_remain;
private EventWaitHandle m_event;
public CountDownLatch (int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
@Remus Tốt bắt trong trật tự mã vòng lặp while của tôi. Liên quan đến lá cờ dễ bay hơi: liệu nó có thực sự tạo ra sự khác biệt nếu lá cờ biến động trong trường hợp này? Nếu nó bỏ lỡ bản cập nhật đầu tiên, sau đó nó sẽ thực hiện thêm một lần nữa thông qua vòng lặp và bắt nó lần sau ... – Kiril
Nếu bạn không đánh dấu nó dễ bay hơi, mã được tạo ra có thể tối ưu hóa giá trị vào sổ đăng ký và chuỗi sẽ * không bao giờ * thấy thay đổi. –
@Remus Tôi nhận được nó ngay bây giờ: atomicity không có gì để làm với khả năng hiển thị giữa các chủ đề ... chỉ vì một hoạt động được thực hiện trong một chu kỳ CPU nó không có nghĩa là kết quả sẽ được hiển thị cho các chủ đề khác trừ khi giá trị được đánh dấu dễ bay hơi. – Kiril