许多线程和临界区

Many threads and critical region

如果我同时有多个线程运行,我怎样才能只允许1个线程进入临界区?另外如果我在临界区有超过 1 个线程会发生什么?

临界区保护不当会导致多种错误,但最常见的错误称为 race condition。当程序行为或输出的正确性取决于以特定顺序发生的事件时,就会发生这种情况,但事件有可能以不同的顺序发生。这往往会导致程序以意外或不可预测的方式运行。 (很抱歉在最后一点上有点含糊,但就其本质而言,除了说 "it probably won't be what you wanted" 之外,通常很难提前预测确切的结果。

通常,要解决此问题,您需要使用某种锁来确保一次只有一个线程可以访问临界区。最常见的机制是 mutex lock,它用于 "simple" 情况 - 您有某种共享资源,并且一次只有一个线程可以访问它。

对于更复杂的情况,还有一些其他机制可用,例如:

  • Reader-写入者锁 - 一个人可以写入资源,或者无限数量的人可以从中读取。
  • 计数信号量 - 一些指定数量的线程可以同时访问一个特定的线程。打个比方,想想一个只有 100 个停车位的停车场 - 一旦 100 辆车停在那里,他们就不能再接受了(或者,至少,直到其中一辆车离开)。
  • .NET Framework 提供了一个 ManualResetEvent - 基本上,有问题的线程必须等到事件发生。
  • 这不是锁 本身 ,但使用 immutable data structures 来避免首先需要锁定的情况正变得越来越普遍。这里的想法是没有线程可以修改另一个线程的数据,它们总是针对本地版本或未修改的 "central" 版本工作。