spinlock,中文译名为“自旋锁”。是专为防止多处理器并发而引入的一种锁。在Linux的内核中,spinlock用在多处理器环境中。当一个CPU访问一个临界资源 (critical section)的时候,需要预先取得spinlock,如果取不到的话,它就在空循环等待,直到另外的CPU释放spinlock。由于涉及到多个处理器,spinlock的效率非常重要。
skynet中的spinlock.h
#ifndef SKYNET_SPINLOCK_H #define SKYNET_SPINLOCK_H #define SPIN_INIT(q) spinlock_init(&(q)->lock); #define SPIN_LOCK(q) spinlock_lock(&(q)->lock); #define SPIN_UNLOCK(q) spinlock_unlock(&(q)->lock); #define SPIN_DESTROY(q) spinlock_destroy(&(q)->lock); #ifndef USE_PTHREAD_LOCK struct spinlock { int lock; }; static inline void spinlock_init(struct spinlock *lock) { lock->lock = 0; } static inline void spinlock_lock(struct spinlock *lock) { while (__sync_lock_test_and_set(&lock->lock,1)) {} } static inline int spinlock_trylock(struct spinlock *lock) { return __sync_lock_test_and_set(&lock->lock,1) == 0; } static inline void spinlock_unlock(struct spinlock *lock) { __sync_lock_release(&lock->lock); } static inline void spinlock_destroy(struct spinlock *lock) { (void) lock; } #else #include <pthread.h> // we use mutex instead of spinlock for some reason // you can also replace to pthread_spinlock struct spinlock { pthread_mutex_t lock; }; static inline void spinlock_init(struct spinlock *lock) { pthread_mutex_init(&lock->lock, NULL); } static inline void spinlock_lock(struct spinlock *lock) { pthread_mutex_lock(&lock->lock); } static inline int spinlock_trylock(struct spinlock *lock) { return pthread_mutex_trylock(&lock->lock) == 0; } static inline void spinlock_unlock(struct spinlock *lock) { pthread_mutex_unlock(&lock->lock); } static inline void spinlock_destroy(struct spinlock *lock) { pthread_mutex_destroy(&lock->lock); } #endif #endif
其中,使用了linux的原子操作:
type __sync_lock_test_and_set (type *ptr, type value, ...) 将*ptr设为value并返回*ptr操作之前的值。 void __sync_lock_release (type *ptr, ...) 将*ptr置0
其他的linux原子操作,参看:
https://blog.csdn.net/hzhsan/article/details/25124901
如何设计一个真正高性能的spin_lock? https://www.zhihu.com/question/55764216