问题:
(1)不需要cas操作来加锁和解锁,这个怎么理解??cas操作不是如果比较不成功那么就一直尝试吗?和加锁有什么关系??这个该如何理解
怪我咯2017-04-18 10:54:40
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。