许多线程和关键区域

时间:2016-10-20 15:06:23

标签: multithreading critical-region

如果我有多个线程同时运行,我怎么才允许只有1个线程进入关键区域?如果我在关键区域有超过1个线程,会发生什么?

1 个答案:

答案 0 :(得分:1)

由于不正确保护的关键部分可能会发生多种错误,但最常见的是race condition。当程序的行为或输出的正确性取决于特定序列中发生的事件时,会发生这种情况,但事件可能以不同的顺序发生。这将导致程序以意外或不可预测的方式运行。 (抱歉在最后一点上有点模糊,但就其本质而言,通常很难提前预测确切结果是什么,而不是说“它可能不是你想要的”。)

通常,为了解决这个问题,您需要使用某种锁来确保只有一个线程可以同时访问关键部分。最常见的机制是mutex lock,它用于“简单”的情况 - 你有一些共享资源,只有一个线程可以同时访问它。

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

  • 读者 - 作家锁 - 任何一方都可以写入资源,或者无限数量的人可以从中读取。
  • 计算信号量 - 某些指定数量的线程可以一次访问特定线程。作为一个类比,想想一个只有100个车位的停车场 - 一旦有100辆车停在那里,他们就不能再接受了(至少,直到其中一个人离开)。
  • .NET Framework提供了ManualResetEvent - 基本上,有问题的线程必须等到事件发生。
  • 这不是一个锁本身,但使用immutable data structures来消除首先锁定的需求变得越来越普遍。这里的想法是没有线程可以修改另一个线程的数据,它们总是对本地版本或未修改的“中央”版本起作用。