Linux驅動--併發控制

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)  釋放

 

信號量適合於保持時間較長的情況,自旋鎖適合於保持時間較短的情況,實際應用中自旋鎖控制的代碼只有幾行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章