我已经阅读了很多有关线程的 Material ,以及涉及的所有同步机制。我也了解未正确执行操作的危险。
我刚刚看过this PDC 2009视频关于并行性和并发性,这里再次提到“锁是昂贵的操作”。现在,我在各种教科书,书中都遇到过这样的短语,而且我也听说过该领域的专家也曾说过。
我想知道,获得一个锁(互斥或信号量)到底有什么昂贵?它是否导致在汇编程序级别发出LOCK#
指令的事实?
获得锁是否需要对OS进行内核调用的事实?
为什么锁被认为是昂贵的操作? “昂贵”是一个相对相对的术语,因此,如果将我们与创建一个新线程(需要建立线程堆栈等)进行比较,那么获得一个锁的成本到底有多高?
封面下面发生了什么?
我的猜测是,它不可能那么昂贵,因为我确定要运行Windows(例如),必须一直使用数百种锁/同步机制。
谁能详细说明?
注意:我只是很好奇,我知道线程是如何工作的,我也不想做一些愚蠢的优化。
最佳答案
不,因为它并不总是这样做。
不,因为它通常不这样做。
实际上,锁非常非常便宜。这是很昂贵的竞争。如果必须在锁定和争用之间进行选择,则大多数情况下,锁定是更好的选择。
锁,如果使用得当,是一种避免争用的机制。它们自动找到争用线程并对其进行调度,从而使线程主要结束于不争用并发运行的线程。
例如:假设您有四个准备运行的线程,即A,B,C和D。说A和B相互竞争(例如,它们操纵相同的集合)。并说C和D相互竞争,但是A不与C竞争。如果A和B同时运行(竞争),则锁将导致其中一个不能准备好运行,调度程序将然后调度C(或D),这两个线程将在没有进一步争用的情况下运行。 (至少直到下一个上下文切换为止。)
通常,当人们说“锁很贵”时,它们意味着争执很昂贵。不幸的是,通过用自己的方式表述它,他们经常鼓励人们最小化锁,但增加了过程中的争用。在绝大多数情况下,这是一个失败的主张。 (有一些异常(exception)。)