gpt4 book ai didi

multithreading - "locks are an expensive operation"经常被说出来的原因是什么?

转载 作者:行者123 更新时间:2023-12-04 00:50:54 24 4
gpt4 key购买 nike

我已经阅读了很多关于线程和所有涉及的同步机制的 Material 。我也理解不正确操作的危险。

我刚看了this PDC 2009 关于并行和并发的视频,这里再次提到“锁是一项昂贵的操作”。我现在在各种文本、书籍中都遇到过这样的短语,而且我听到该领域的专家也说过。

我想知道,获得锁(互斥锁或信号量)究竟有什么代价?是否会导致 LOCK#要在汇编程序级别发出的指令?

获取锁需要内核调用操作系统吗?

为什么锁被认为是一项昂贵的操作? “昂贵”是一个相当相对的术语,因此如果与创建新线程(需要设置线程堆栈等)相比,获取锁的成本究竟有多大?

封面下发生了什么?

我的猜测是,它不可能那么昂贵,因为我确信要运行 Windows(例如),必须一直使用数百个锁/同步机制。

谁能详细说明一下?

注意:我只是好奇,我知道线程是如何工作的,而且我也不打算做一些愚蠢的优化。

最佳答案

Is it the fact that it causes a LOCK# instruction to be emitted at Assembler level?



不,因为它并不总是那样做。

Is it the fact that obtaining a lock requires a kernel call into the OS?



不,因为它通常不会这样做。

事实上,锁非常非常便宜。竞争是昂贵的。如果您必须在锁定和争用之间进行选择,大多数情况下锁定是更好的选择。

如果使用得当,锁是一种避免争用的机制。它们会自动找到争用的线程并取消调度它们,这样一来,主要会以不争用并发运行的线程结束。

例如:假设您有四个线程准备运行,A、B、C 和 D。假设 A 和 B 相互竞争(假设它们操作同一个集合)。并且说 C 和 D 相互争用,但 A 不与 C 争用。 如果 A 和 B 同时运行(争用),锁将导致其中之一未准备好运行,调度程序将然后调度 C(或 D),两个线程将运行而不会进一步争用。 (至少在下一次上下文切换之前。)

通常,当人们说“锁很贵”时,他们的意思是争用很贵。不幸的是,通过用他们的方式表达它,他们经常鼓励人们尽量减少锁,但会增加过程中的争用。在绝大多数情况下,这是一个失败的提议。 (有一些异常(exception)。)

关于multithreading - "locks are an expensive operation"经常被说出来的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com