在并发编程中,是否有可能通过使用锁,程序有时可能会使用比必要更多的处理器?

In concurrent programming is it possible that, by using locks, a program might sometimes use more processors than are necessary?

这是一道考试题(练习题,不是真题)。它是关于使用多核处理器的并发编程和使用锁的问题。

“在并发编程中,是否有可能通过使用锁,程序有时可能会使用比必要更多的处理器?”

换句话说,这可能吗?这是一道 true/false 题。我到处都找不到答案,我正在复习考试。

N个执行线程的并发程序在任意时刻使用锁,可以有M=0 .. N-1个线程等待锁;因此该程序只能使用 N-M 个处理器,因为等待锁定不需要处理器。 因此,不,使用锁不会增加并发程序所需的处理器数量。

使用高效多线程和锁的实现,如果一个线程在任何重要的时间阻塞等待锁,调度程序/锁实现将重新分配核心来做别的。

但是由于考试问题是问是否 曾经 可能使用比绝对必要更多的处理器,答案是这取决于线程/锁/调度。例如,有一种称为自旋锁的锁,其中锁实现在等待获取锁时不会放弃对处理器的控制。相反,它会在一个紧密的循环中轮询锁以尝试获取它。

你为什么要这么做?好吧,如果锁很可能在足够短的时间内变得可用,那么 CPU 浪费在锁上的“旋转”比执行完整上下文切换所花费的要少。

所以我认为你的试题没有简单的是/否答案。