Linux内核同步机制,挺复杂的一个东西,常用的有自旋锁,信号量,互斥体,原子操作,顺序锁,RCU,内存屏障等。这里说说它们的特点和基本用法。
  自旋锁 :通用的 和读写的
  特点:
  1. 处理的时间很短。
  2. 尝试获取锁时,不能睡眠,但是有trylock接口可以直接退出。
  3. 多用在中断中。
  4. 任何时候只有一个保持者能够访问临界区。
  5. 可以被中断打断的(硬件和软件的)
  6. 获取自旋锁后首先是关闭了抢占
  spin_lock使用接口:
void spin_lock_init(spinlock_t *lock);
//init
void spin_lock(spinlock_t *lock);
// 获取锁
void spin_unlock(spinlock_t *lock);
//释放锁
其他变体
typedef struct spinlock {
union {
struct raw_spinlock rlock;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
struct {
u8 __padding[LOCK_PADSIZE];
struct lockdep_map dep_map;
};
#endif
};
} spinlock_t;
  Rwlock: 读写自旋锁基本特点和通用自旋锁一样,但是有时候多线程频繁读取临界区如果同时只能一个那么效率会很低,它的特点是在读的时候获取读锁,可以同时有N个线程同时读,在写时需要获得写锁(不能有读和写锁)。
  在读操作时,写操作必须等待;写操作时,读操作也需要的等待。这样虽然避免了数据的不一致,但是某些操作要等待,后面还会出现顺序锁,是对读写锁的优化,把写的优先级调高了
  使用接口:
rwlock_init(lock);
//init
read_lock(lock);
//获取读锁
read_unlock(lock) ;
write_lock (lock);
//获取写锁
write_unlock(lock);
/*
* include/linux/rwlock_types.h - generic rwlock type definitions
*                 and initializers
*
* portions Copyright 2005, Red Hat, Inc., Ingo Molnar
* Released under the General Public License (GPL).
*/
typedef struct {
arch_rwlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} rwlock_t;