Update on 2012-12-27: 知道 xchg 实现的 spinlock 竞争严重时变慢的原因后可以对它做一点优化。拿锁失败,发现锁还没有释放时应该尝试等待一段时间而不是不停的去检查,这样就可以避免同时有太多的核进行拿锁操作。优化之后的 xchg spinlock 性能在单个 CPU chip 上明显超过 pthread mutex,核数变多时也还是会胜过一些。加入 exponential backoff 的 spinlock 实现也放在 github 上了。实现简单 spinlock 时 waiter 一定要加 wait backoff,这个技术对 spinlock 的伸缩性影响巨大。
严格的说应该是 pthread mutex 在 Linux 上其实非常快,用户态程序没有特殊需求就不要自己去实现 spinlock 了。
今天受实验室同学的启发,把以前测试 spinlock 性能的 micro benchmark 用 pthread mutex 也试了一下,结果发现这货真是逆天了!