84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
问题:(1)不需要cas操作来加锁和解锁,这个怎么理解??cas操作不是如果比较不成功那么就一直尝试吗?和加锁有什么关系??这个该如何理解
走同样的路,发现不同的人生
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。
wait_for_unlock_signal()
compare and swap操作不一定不需要鎖,看平台,但是大多數平台都是支援無鎖cas的。最簡單的鎖是透過test and set實現的自旋鎖,當然透過cas也可以實現。
自旋鎖在上鎖失敗時的確會不斷嘗試,耗盡cpu資源。如
系統介面提供的鎖,上鎖失敗時一般會掛起線程,類似
這裡的
wait_for_unlock_signal()
是個假想函數。但是上鎖依然依賴類似cas的原子操作。也就是說,現在鎖都是透過一些基本的原子操作來實現的,如test and set和compare and swap。