Tôi đã đọc câu trả lời cho một similar question, nhưng tôi vẫn còn một chút nhầm lẫn ... Abel đã có một câu trả lời tuyệt vời, nhưng đây là phần mà tôi không chắc chắn về:Liệu khả năng hiển thị đảm bảo được khóa liên động với các chủ đề khác trong C# hay tôi vẫn phải sử dụng dễ bay hơi?
.. .declaring biến biến động làm cho nó dễ bay hơi cho mỗi truy cập duy nhất. Không thể ép buộc hành vi này theo bất kỳ cách nào khác, do đó dễ bay hơi không thể được thay thế bằng Lồng vào nhau. Điều này là cần thiết trong các trường hợp trong đó các thư viện, giao diện khác hoặc phần cứng có thể truy cập biến của bạn và cập nhật bất cứ lúc nào hoặc cần phiên bản gần đây nhất .
Liệu Interlocked
tầm nhìn bảo đảm các hoạt động nguyên tử cho tất cả các chủ đề, hay tôi vẫn phải sử dụng từ khóa volatile
trên giá trị để đảm bảo tầm nhìn của sự thay đổi?
Dưới đây là ví dụ của tôi:
volatile int value = 100000; // <-- do I need the volitile keyword
// ....
public void AnotherThreadMethod()
{
while(Interlocked.Decrement(ref value)>0)
{
// do something
}
}
public void AThreadMethod()
{
while(value > 0)
{
// do something
}
}
Cập nhật:
tôi còn là một môn thể thao xấu và tôi đã thay đổi ví dụ ban đầu, do đó, đây là một lần nữa:
public class CountDownLatch
{
private volatile int m_remain; // <--- do I need the volatile keyword here?
private EventWaitHandle m_event;
public CountDownLatch(int count)
{
Reset(count);
}
public void Reset(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();
}
}
Xin lỗi vì đã có nhiều chỉnh sửa ... Remus là một môn thể thao tốt về nó. Cảm ơn vì thông tin! :) – Kiril