【问题标题】:Is it ok to use spinlocks with O(1) non-memory contiguous code?可以将自旋锁与 O(1) 非内存连续代码一起使用吗?
【发布时间】:2013-02-08 23:28:58
【问题描述】:

我正在使用自旋锁(pthread),一般 O(1) 在锁定的代码部分中列出元素访问/删除。

我说一般是因为在 99.9% 的情况下,代码不会循环遍历列表(可能包含 1000 多个元素)。
代码通常会根据列表元素 hint 指针仅提取一个元素,然后执行几个 if 分支来修改引用的 hint 元素;仍然应该是对内存的非连续访问。

使用自旋锁是个好主意还是应该改用互斥锁?

我的目标是最大性能,在这种情况下不要关心 CPU(过度)使用。

干杯

【问题讨论】:

  • 基准测试。我认为没有人可以用您提供的详细信息为您回答这个问题。
  • 性能是什么意思?我认为 cpu 使用率是性能...
  • @thang:不,使用自旋锁,CPU 使用率只会让房间升温。
  • 嗯?性能可能意味着很多事情。问题是当你想要最大性能时你的意思是什么......
  • 肯定与普通的 pthread 互斥锁进行比较。普通的互斥体在诉诸系统调用之前已经进行了大量的智能旋转,我想你很难自己想出一个更聪明的策略。

标签: c++ c linux gcc spinlock


【解决方案1】:

在使用可重现的测试用例进行一些基准测试之后,在 pthread mutexspinlock 实现之间切换,我可以说如果 mutex 使用的 CPU 少一点,自旋锁 实现在处理队列中的元素时速度是原来的两倍。

我相信正确的答案,考虑到处理列表的函数的 O(1) 特性以及这个(大部分)恒定时间很小的事实,赞成 spinlock 选择与 mutex

因此,如果想要获得最大性能,而不关心 CPU 浪费的周期,spinlocksmutexes 更可取,以防受保护的代码执行时间是 tiny(以及更好的常量)。

【讨论】:

    【解决方案2】:

    一般来说,对于较短的关键部分(比如它只是更新列表指针的地方),自旋锁可能是首选。

    由于争用很少,自旋锁和互斥锁之间的区别应该很小,因为非争用路径在后者中得到了高度优化。

    当关键部分发生争用时,差异就出现了。当互斥锁被占用时,锁定它会阻塞线程并将其从调度程序运行队列中取出,当互斥锁最终被释放时,它会花费更长的时间来唤醒并锁定互斥锁,而自旋锁只会自旋以希望自旋锁即将发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 2017-02-16
      • 2019-01-09
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多