一起來讀源碼602-skynet 原子鎖

詳細說明請看:

原子操作:
ATOM_CAS(ptr, oval, nval) //值比較替換:在寫入新值之前, 讀出舊值, 
                        //當且僅當舊值與存儲中的當前值一致時,才把新值寫入存儲
ATOM_CAS_POINTER(ptr, oval, nval) //指針比較替換:在寫入新指針之前, 讀出舊指針, 
                        //當且僅當舊指針與存儲中的當前新指針一致時,才把新指針寫入存儲
ATOM_INC(ptr) //先加1再返回 例子:開始ptr = 1; ATOM_INC(ptr) 返回2,ptr的值爲2
ATOM_FINC(ptr) //先返回再加1 例子:開始ptr = 1; ATOM_FINC(ptr) 返回1,ptr的值爲2
ATOM_DEC(ptr) //先減1再返回
ATOM_FDEC(ptr) //先返回再減1
ATOM_ADD(ptr,n) //先加n再返回
ATOM_SUB(ptr,n) //先減n再返回
ATOM_AND(ptr,n) //先做and操作再返回

讀寫鎖:
rwlock
rwlock_init(struct rwlock *lock)
rwlock_rlock(struct rwlock *lock)
rwlock_wlock(struct rwlock *lock)
2種實現方式:
    使用系統的線程鎖
    使用 pthread.h 的鎖
期間用到了 __sync_synchronize() 內存屏障,主要爲了解決gcc的一個亂序執行bug,
(此bug存在於低版本的gcc,高版本已修復)

自旋鎖:
spinlock
spinlock_init(struct spinlock *lock) //初始化
spinlock_lock(struct spinlock *lock) //鎖住
spinlock_trylock(struct spinlock *lock) //嘗試解鎖
spinlock_unlock(struct spinlock *lock) //解鎖
spinlock_destroy(struct spinlock *lock) //摧毀鎖
2種實現方式:
    使用系統的線程鎖
    使用 pthread.h 的鎖
自旋鎖是一種互斥鎖的實現方式,相比一般的互斥鎖會在等待期間放棄cpu,
自旋鎖(spinlock)則是不斷循環並測試鎖的狀態,這樣就一直佔着cpu。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章