如果我有许多线程同时运行,我怎样才能只允许 1 个线程进入临界区?另外,如果我在关键区域中有超过 1 个线程会发生什么?
问问题
105 次
1 回答
1
由于关键部分保护不当,可能会发生多种错误,但最常见的称为竞态条件。当您的程序行为或输出的正确性取决于以特定顺序发生的事件时,就会发生这种情况,但事件可能会以不同的顺序发生。这往往会导致程序以意外或不可预测的方式运行。(很抱歉在最后一点上有点含糊,但就其本质而言,通常很难提前预测确切的结果,除了说“它可能不是你想要的”)。
通常,要解决此问题,您会使用某种锁来确保一次只有一个线程可以访问临界区。最常见的机制是互斥锁,它用于“简单”情况——你有某种共享资源,一次只有一个线程可以访问它。
对于更复杂的情况,还有一些其他机制可用,例如:
- Reader-Writer Locks - 一个人可以写入资源,或者无限数量的人可以从中读取。
- 计数信号量 - 某些指定数量的线程可以一次访问特定线程。打个比方,想想一个只有 100 个车位的停车场——一旦 100 辆车停在那里,他们就不能再接受了(或者,至少在其中一辆离开之前)。
- .NET Framework 提供了ManualResetEvent - 基本上,有问题的线程必须等到事件发生。
- 这本身不是锁,但使用不可变数据结构来消除对锁定的需求变得越来越普遍。这里的想法是没有线程可以修改另一个线程的数据,它们总是针对本地版本或未修改的“中央”版本工作。
于 2016-10-20T15:26:19.343 回答