gpt4 book ai didi

c# - 什么时候更细粒度的锁定对性能更好?

转载 作者:太空宇宙 更新时间:2023-11-03 21:54:21 26 4
gpt4 key购买 nike

我最近尝试使用跳表数据结构实现并发优先级队列 - 对于这个问题,如果您不知道什么是跳表,我相信只要想象一下链表就可以了足以回答。我尝试了最小锁定(即允许同时进行多个入队和出队,必要时只锁定节点或它们的前向指针,尽快释放锁,使用 Interlocked 遍历列表等)。

我对结果很满意。然而,编写一个带有同步根锁的添加和删除的常规跳过列表(即在任何给定时间只允许一个操作)实际上要快两倍。

我假设我的实现中一定有错误。然而,即使是 Microsoft 网站上列出的“并发优先级队列”,实际上一次也只允许一个操作(即围绕入队和出队的同步根锁)

http://code.msdn.microsoft.com/Samples-for-Parallel-b4b76364/sourcecode?fileId=44488&pathId=1696822056

作为一般规则(如果这个问题太笼统,请原谅我),在什么时候更细粒度的锁定实际上会带来性能提升?我想在我的情况下,因为我实际上必须使用 Interlocked.Exchange 遍历大型列表(有更好的方法吗?)以及多个测试和测试和设置等,这会减慢入队和出队的速度。

此外,是否有一种工具可以帮助我确定大部分时间花在了哪些地方?谢谢。

最佳答案

不断检查锁定区域当前是否空闲、设置锁定并在离开时释放锁定会产生开销。如果在实践中,您实际上很少与其他任何人竞争访问该关键部分,那么您只是无缘无故地执行了该开销。另一方面,如果有很多线程尝试使用您的数据结构,那么您可能会发现并行运行操作(如果您有多个核心 CPU)所提高的性能超过了管理锁的开销。

对于这些类型的数据结构,有几十个线程都试图同时使用该数据结构,同时执行通常不需要它们相互等待的操作,这是一种相当罕见的情况。因此,简而言之,您可能会生成测试用例,通过添加线程并正确管理它们正在做的事情,从而使较少的锁用例执行得更好。如果您当前的测试合理地表示了您实际计划如何使用数据结构,那么显然您的使用不会受益于更精细的锁定方案。

关于c# - 什么时候更细粒度的锁定对性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12975935/

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