为什么锁可能成为多线程程序的瓶颈?

时间:2009-06-09 04:14:26

标签: multithreading locking

为什么锁可能成为多线程程序的瓶颈?

如果我想让我的队列频繁pop()和push()多线程,

我应该使用哪个锁?

6 个答案:

答案 0 :(得分:3)

您使用的锁取决于您的平台,但通常会有一些互斥。在Windows上,您将使用临界区,在.NET中,您将使用监视器。我对其他平台上的锁定机制不是很熟悉。我会远离无锁方法。它们很难正确编程,性能提升往往没有您想象的那么大。

当你的程序受到严重争用时,锁会成为程序的瓶颈。也就是说,非常多的线程都试图同时获取锁。当线程被阻塞并且操作系统花费越来越多的时间在线程之间切换时,这会浪费大量的CPU周期。这种问题最常出现在服务器世界中。对于桌面应用程序,锁定很少会导致性能问题。

答案 1 :(得分:2)

“为什么锁定可能成为多线程程序的瓶颈?” - 想象一个turnstile(也称为挡板门),它只允许一个人通过,一群人等着通过它。

对于队列,请使用您的环境提供的最简单锁定。

答案 2 :(得分:1)

对于队列,很容易编写无锁实现(google away)

锁是瓶颈,因为它们会强制遇到它们的所有其他线程停止做他们正在做的事情并等待锁打开,从而浪费时间。多线程背后的一个想法是在任何给定时间使用尽可能多的处理器。通过强制线程在锁上等待,应用程序基本上放弃了它可能使用的处理能力。

答案 3 :(得分:1)

“为什么锁定可能成为多线程程序的瓶颈?” 因为等待线程保持阻塞状态,直到共享内存被解锁。

建议你阅读这篇文章“并发:每个开发者必须了解多线程应用程序的内容”http://msdn.microsoft.com/en-au/magazine/cc163744.aspx

答案 4 :(得分:0)

锁是昂贵的,因为它们需要在算法中间进行操作系统调用,并且因为在创建CPU时很难正确执行。

作为程序员,最好将数据结构中间的锁留给专家,而是使用好的multithreaded library,例如Intel's TBB

对于队列,如果可能,您可能希望使用原子指令(硬)或自旋锁(更容易),因为它们与互斥锁相比便宜。如果要进行大量需要锁定的工作,请使用互斥锁,即修改复杂的树结构

答案 5 :(得分:0)

在我熟悉的线程包中,您对互斥锁的选项是递归的和非递归的。您应该选择非递归 - 您的所有访问都将是lock(); queue_op(); unlock(),所以不需要两次获取锁。