1、信號量
struct semaphore sem 定義信號量
void sema_init(struct semaphore *sem, int val)用於初始化設置信號量的值爲val
void init_mutex(struct semaphore *sem)用於初始化一個互斥信號量,設置sem的值爲1
void init_mutex_locked(struct semaphore *sem)用於初始化一個互斥信號量,設置sem的值爲0,即一開始就處於鎖定狀態
DECLARE_MUTEX(name)定義一個信號量name,並將它的值初始化爲1,由宏將定義與初始化的工作一步完成
void down(struct semaphore *sem) 獲取信號量,將sem的值減1,如果sem非負,就直接返回,否則調用者將被掛起(睡眠),直到別的任務釋放信號量,不推薦使用
void down_interruptibal(struct semaphore *sem) 獲取信號量,如果信號不可用,進程將被置爲TASK_INTERRUPTIBLE類型的睡眠。返回值有兩種情況,一是正常返回0,表求獲得信號量正常返回(從1減到0),另一種是被中斷,返回-EINTR。建議使用
2、自旋鎖
獲取不到不會睡眠,會一直佔有cpu,一直查看。最多隻能被一個執行單元執行(一個持有者)。
spin_lock_init(x) 初始化自旋鎖,使用前必須初始化
spin_lock(lock) 獲取自旋鎖,若成功,獲得鎖並立即返回,否則它將一直自旋在那裏直到該自旋鎖的保持者釋放。
spin_trylock(lock) 獲取不成功立即返回假
spin_unlock(lock) 釋放
信號量適合於保持時間較長的情況,自旋鎖適合於保持時間較短的情況,實際應用中自旋鎖控制的代碼只有幾行。