在他对C#中的线程处理的优秀论述中,Joseph Albahari提出了以下简单程序,以展示为什么我们需要在被多个线程读写的数据周围使用某种形式的内存栅栏。如果您在无调试器的Release模式下编译并自由运行该程序,则该程序永远不会结束:
我的问题是,为什么以下稍作修改的程序版本不再无限期地阻塞?
以下仍会无限期阻塞:
与此类似的还有以下内容:
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
}
我的问题是,为什么以下稍作修改的程序版本不再无限期地阻塞?
class Foo
{
public bool Complete { get; set; }
}
class Program
{
static void Main()
{
var foo = new Foo();
var t = new Thread(() =>
{
bool toggle = false;
while (!foo.Complete) toggle = !toggle;
});
t.Start();
Thread.Sleep(1000);
foo.Complete = true;
t.Join(); // No longer blocks indefinitely!!!
}
}
以下仍会无限期阻塞:
class Foo
{
public bool Complete;// { get; set; }
}
class Program
{
static void Main()
{
var foo = new Foo();
var t = new Thread(() =>
{
bool toggle = false;
while (!foo.Complete) toggle = !toggle;
});
t.Start();
Thread.Sleep(1000);
foo.Complete = true;
t.Join(); // Still blocks indefinitely!!!
}
}
与此类似的还有以下内容:
class Program
{
static bool Complete { get; set; }
static void Main()
{
var t = new Thread(() =>
{
bool toggle = false;
while (!Complete) toggle = !toggle;
});
t.Start();
Thread.Sleep(1000);
Complete = true;
t.Join(); // Still blocks indefinitely!!!
}
}