compare and swap操作不一定不需要锁,看平台,但是大多数平台都是支持无锁cas的。最简单的锁是通过test and set实现的自旋锁,当然通过cas也可以实现。 自旋锁在上锁失败时的确会不断尝试,耗尽cpu资源。如 while (flag.test_and_set()) { /* yield; */ } // 上锁 flag.clear(); // 解锁 系统接口提供的锁,上锁失败时一般会挂起线程,类似 while (flag.test_and_set()) { flag.wait_for_unlock_signal(); } // 上锁 这里的wait_for_unlock_signal()是个假想函数。但是上锁依然依赖类似cas的原子操作。也就是说,现在锁都是通过一些基本的原子操作来实现的,如test and set和compare and swap。
compare and swap操作不一定不需要锁,看平台,但是大多数平台都是支持无锁cas的。最简单的锁是通过test and set实现的自旋锁,当然通过cas也可以实现。
自旋锁在上锁失败时的确会不断尝试,耗尽cpu资源。如
系统接口提供的锁,上锁失败时一般会挂起线程,类似
这里的
wait_for_unlock_signal()
是个假想函数。但是上锁依然依赖类似cas的原子操作。也就是说,现在锁都是通过一些基本的原子操作来实现的,如test and set和compare and swap。