自旋锁是内存分配器的不错选择吗?

dsi*_*cha 8 concurrency garbage-collection mutex memory-management d

我已经向D编程语言运行时的维护者建议了几次内存分配器/垃圾收集器应该使用自旋锁而不是常规的OS关键部分.这并没有真正流行起来.以下是我认为自旋锁更好的原因:

  1. 至少在我所做的综合基准测试中,当存在内存分配器/ GC锁争用时,它比OS关键部分快几倍.编辑:根据经验,使用自旋锁在单核环境中甚至没有可测量的开销,可能是因为锁需要在内存分配器中保持如此短的时间.
  2. 内存分配和类似操作通常只需要一小部分时间片,甚至是上下文切换所花费的一小部分时间,这使得在争用情况下上下文切换变得愚蠢.
  3. 无论如何,有问题的实现中的垃圾收集会阻止世界.在收集过程中不会有任何旋转.

有没有充分的理由不在内存分配器/垃圾收集器实现中使用自旋锁?

Mic*_*urr 2

无论如何,在 Windows 上,关键部分对象已经可以选择执行此操作(http://msdn.microsoft.com/en-us/library/ms682530.aspx):

线程使用InitializeCriticalSectionAndSpinCount 或SetCriticalSectionSpinCount 函数指定临界区对象的旋转计数。自旋是指当一个线程试图获取一个被锁定的临界区时,该线程进入一个循环,检查锁是否被释放,如果锁没有释放,则该线程进入睡眠状态。在单处理器系统上,自旋计数被忽略,临界区自旋计数设置为 0(零)。在多处理器系统上,如果临界区不可用,则调用线程会在对与临界区关联的信号量执行等待操作之前旋转 dwSpinCount 次。如果临界区在自旋操作期间变得空闲,则调用线程将避免等待操作。

如果其他平台还没有这样做的话,希望其他平台也能效仿。