内核线程同步之信号量、互斥量、自旋锁、原子量
本次主要是学习线程同步时保护数据的锁机制,对于多个线程同时对一个变量进行赋值操作时,会造成该变量的赋值不确定,出现了竞争状态,这时需要有个锁来保护下,即加个锁,同一时间只能有一个线程对其操作,当锁释放了,另一线程才能对其操作,而处在加锁和解锁之间的区域叫做临界区,对临界区的操作要保证其原子性,即一次性搞定,不能被中断,而内核也提供了原子量,用于轻量级操作。 接下来说说内核里相关的内容吧: 1.原子量 1).结构体 在include/linux/types.h文件中有如下结构体(分别对应32位和64位系统): typedef struct { int counter; } atomic_t; #ifdef CONFIG_64BIT typedef struct { long counter; } atomic64_t; #endif 2).整型原子操作 在include/asm-generic/atomic.h文件中有如下操作宏和函数定义: a.创建及初始化 #define ATOMIC_INIT(i) { (i) } #define atomic_set(v, i) (((v)->counter) = (i)) b.读取原子量 #define atomic_read(v) (*(volatile int *)&(v)->counter) c.原子量常用运算(加、减、自加一、自减一) static inline void atomic_add(int i, atomic_t *v) ; static inline void atomic_sub(int i, atomic_t *v) ; static inline void atomic_inc(atomic_t *v) ; static inline void atomic_dec(atomic_t *v) ; d.原子量运算并检测运算后是否等于0 #define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0) #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0) #define atomic_i...