我在锁定代码部分使用 O(1)列表元素访问/删除的自旋锁( pthread )。
我说一般因为99.9%的情况下代码没有遍历列表(可能包含1000多个元素)。
代码通常会根据列表元素提示指针提取一个唯一的元素,然后执行几个 if 分支来修改引用的提示元素;仍然应该是对内存的不连续访问。
使用自旋锁是一个好主意还是应该转移到互斥锁?
我的目标是获得最高性能,在这种情况下不关心CPU(过度)使用。
干杯
答案 0 :(得分:0)
通常,对于较短的关键部分(例如它只是更新列表指针的地方),自旋锁可能是首选。
由于争用很少,自旋锁和互斥锁之间应该没有什么区别,因为非争用路径在后者中得到了很大的优化。
当一个关键部分争用时,就会出现差异。当获取互斥锁时,锁定它会阻塞线程并将其从调度程序运行队列中取出,使其更长时间唤醒并在最终释放时锁定互斥锁,而旋转锁只会旋转,希望旋转锁定很快就会发布。
答案 1 :(得分:0)
在使用可重现的测试用例进行一些基准测试后,在 pthread mutex 和 spinlock 实现之间切换,我可以说if mutex使用的CPU少了一点, spinlock 的实现速度是处理队列中元素的两倍。
我相信正确的答案,因为处理列表的函数的 O(1)性质以及这个(大部分)常量时间的事实是微小,支持 spinlock 选择与互斥。
因此,如果想要实现最高性能,并不关心CPU浪费的周期,那么自旋锁与互斥相比,以防受保护的代码执行时间为小(和更好的常数)。