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