没有CAS指令的平台如何实现自旋锁?

How spin locks are implemented on platforms without CAS instructions?

通常的做法是在支持 CAS 指令的平台上将 CAS 指令包装在 while 循环中。但是 SPARC 等平台没有原子 CAS 指令。

SPARC v8(32 位)及更​​早版本缺少 CAS,但 v9(64 位)有 CAS。

对于自旋锁,v7 和 v8 提供 LDSTUB,这是一个无符号字节的原子读取修改写入,写入 0xFF。那就是自旋锁的锁定阶段。使用 TSO 时,普通写入 0(或任何非 0xFF 的内容)将解锁——对于 PSO,您需要在写入前使用 STBAR。 [还有SWAPatomic-read-modify-write,同样可以使用。]

要在 v7/v8 上实现 CAS(和 Fetch-Op)操作,您需要一个辅助自旋锁。

更一般地说:

  • (如注释中所述)对于 "modern" 设备,如果不支持 CAS,则某种形式的 "LL/SC" 可能是...

    ...并且可以使用 LL/SC 合成 CAS 操作。 [FWIW:LL/SC 比 CAS 更通用,避免了直接 CAS 容易出现的可怕的 ABA :-(]

  • 但除此之外,一旦你有了自旋锁,你就可以模拟大多数事情...

    ...但是如果持有自旋锁的线程进入休眠状态,每个人都会等待 :-(

既不提供 LL/SC 也不提供自旋锁硬件支持的机器(现在是历史性的)很可能具有顺序一致的内存。在这种情况下,您可以在软件中使用 Peterson 算法、Burns 算法或其他算法)实现自旋锁。