一起来读源码602-skynet 原子锁

详细说明请看:

  • atomic.h
  • twlock.h
  • spinlock.h

原子操作:
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。

你可能感兴趣的:(一起读源码,skynet)