在大多数情况下,局部变量是特定于线程的,因此与之相关的问题volatile
完全没有必要。
当它像您的示例一样,它是一个“捕获的”变量时,这种情况会发生变化 - 当它被默默地实现为编译器生成的类上的一个字段时。所以理论上它可能是不稳定的,但在大多数情况下,它不值得额外的复杂性。
特别是,像Monitor
(aka lock
) with Pulse
etc 这样的东西也可以做到这一点,任何数量的其他线程结构也可以。
线程很棘手,主动循环很少是管理它的最佳方式......
重新编辑......secondThread.Join()
将是显而易见的事情 - 但如果您真的想使用单独的令牌,请参见下文。这样做的优点(相对于类似的东西ManualResetEvent
)是它不需要操作系统提供任何东西 - 它纯粹在 CLI 内部处理。
using System;
using System.Threading;
static class Program {
static void WriteLine(string message) {
Console.WriteLine(Thread.CurrentThread.Name + ": " + message);
}
static void Main() {
Thread.CurrentThread.Name = "Main";
object syncLock = new object();
Thread thread = new Thread(DoStuff);
thread.Name = "DoStuff";
lock (syncLock) {
WriteLine("starting second thread");
thread.Start(syncLock);
Monitor.Wait(syncLock);
}
WriteLine("exiting");
}
static void DoStuff(object lockHandle) {
WriteLine("entered");
for (int i = 0; i < 10; i++) {
Thread.Sleep(500);
WriteLine("working...");
}
lock (lockHandle) {
Monitor.Pulse(lockHandle);
}
WriteLine("exiting");
}
}