【发布时间】:2019-02-18 19:28:53
【问题描述】:
我正在研究 C# 线程,遵循著名的“C# in a Nutshell”,在调查 Thread.MemoryBarrier() 现象期间,当我在 Why we need Thread.MemoryBarrier()? 上偶然发现 Brian 的示例时,我吓死了。
我有 i-7 8700K 处理器和 4.6.1 .NET,即使在程序中进行了以下更改,我也设法重现了问题(程序永远不会结束):
class Program
{
static bool stop = false;
public static void Main(string[] args)
{
var t = new Thread(() =>
{
Console.WriteLine($"Thread begin");
bool toggle = false;
//while (true)
while (!stop)
{
if (stop)
{
break;
}
toggle = !toggle;
}
Console.WriteLine($"Thread end");
});
t.Start();
Thread.Sleep(1000);
stop = true;
Console.WriteLine($"Stop flag set. Waiting for thread to end...");
t.Join();
Console.ReadKey();
}
}
因此,即使使用“如果(停止)”检查,问题也会重现,我明白为什么。当我在该检查问题没有重现之前放置“Thread.MemoryBarrier()”时(至少我没有重现它),我明白为什么。但我不明白的是,为什么当我更改 while 条件并放置“while (true)”而不是“while (!stop)”时问题不再重现?是否与“while(true)”语句的特殊处理有关?
【问题讨论】:
标签: c# multithreading thread-safety clr memory-barriers