互斥體、原子操作、自旋鎖、訊號量
一、互斥體
struct mutex my_mutex;//定義mutex
mutex_init(&my_mutex);//初始化mutex
mutex_lock(&my_mutex);//獲取mutex
... //臨界資源
mutex_unlock(&my_mutex);//釋放mutex
二、原子操作
1、定義
原子操作指的是在執行過程中不會被中斷的操作。
2、整型原子操作
1)設定原子變數的值
void atomic_set(atomic_t *v, int i);//設定原子變數的值為i
atomic_t v = ATOMIC_INIT(0);//定義原子變數v並初始化為0
2)獲取原子變數的值
atomic_read(atomic_t *v);
3)原子變數加/減,原子變數自增/自減
void atomic_add(int i, atomic_t *v);
void atomic_sub(int i, atomic_t *v);
void atomic_inc(atomic_t *v);
void atomic_dec(atomic_t *v);
4)操作並測試
int atomic_inc_and_test(atomic_t *v);
int atomic_dec_and_test(atomic_t *v);
int atomic_sub_and_test(int i, atomic_t *v);
上述操作對原子變數執行自增、自減和減操作後測試是否為0,為0返回true,否則返回false。
3、位原子操作
。。。。。。//詳見《Linux裝置驅動開發詳解》P138
三、自旋鎖
spinlock_t lock;
spin_lock_init(&lock);
spin_lock(&lock);
.../臨界區
spin_unlock(&lock);
四、訊號量