Tôi nghĩ rằng hầu hết mọi người nhận thức được những vấn đề sau đây sẽ xảy ra khi xây dựng trong chế độ Release (mã lấy từ Threading in C#):dễ bay hơi weirdness
static void Main()
{
bool complete = false;
var t = new Thread (() =>
{
bool toggle = false;
while (!complete) toggle = !toggle;
});
t.Start();
Thread.Sleep (1000);
complete = true;
t.Join(); // Blocks indefinitely
}
do tối ưu hóa trình biên dịch bộ nhớ đệm giá trị của complete
và do đó ngăn ngừa trẻ chuỗi từ bao giờ nhìn thấy giá trị được cập nhật.
Tuy nhiên, thay đổi mã trên một chút:
class Wrapper
{
public bool Complete { get; set; }
}
class Test
{
Wrapper wrapper = new Wrapper();
static void Main()
{
var test = new Test();
var t = new Thread(() =>
{
bool toggle = false;
while (!test.wrapper.Complete) toggle = !toggle;
});
t.Start();
Thread.Sleep(1000);
test.wrapper.Complete = true;
t.Join(); // Blocks indefinitely
}
}
làm cho vấn đề đi xa (tức là sợi con có thể thoát khỏi sau 1 giây) mà không cần dùng volatile
, hàng rào bộ nhớ, hoặc bất kỳ khác cơ chế giới thiệu một hàng rào ngầm.
Cách đóng gói bổ sung của cờ hoàn thành ảnh hưởng đến khả năng hiển thị giữa các chuỗi?
Mã của bạn không được bảo đảm để hoạt động, nhưng cũng không đảm bảo không thành công. Bạn không nên dựa vào tối ưu hóa trình biên dịch cho tính chính xác (hoặc không chính xác trong trường hợp này). – svick
@svick: Tôi không thực sự. Nó chỉ là một cái gì đó tôi nhận thấy vô tình. – Tudor
bản sao có thể có của [Ví dụ tái tạo về việc sử dụng dễ bay hơi] (http://stackoverflow.com/questions/6164466/a-reproducable-example-of-volatile-usage) –