1. 程式人生 > >LInux系統中使用訊號量對兩個程序中訪問同一資源互斥注意事項

LInux系統中使用訊號量對兩個程序中訪問同一資源互斥注意事項

對於同一個共享資源的訪問,在Linux系統應用程式設計中經常遇到,通過訊號量來保護共享資源,實現互斥非常重要,對於實現互斥一般有如下幾個步驟: (1):建立訊號量:呼叫 int semget(key_t key,int num,int mode) 引數一:鍵值——————保證唯一性 引數二:表示建立幾個訊號量 引數三:一般填IPC_CREAT 利用此建立訊號量,返回該訊號量的ID————semid;

(2):初始化訊號量值 int semctl(int semid,int index,int cmd,int val); 引數一:訊號量的ID值 引數二:初始化的訊號量的索引,即初始化第幾個訊號量,如果第一步建立了一個訊號量,則這裡索引為 0; 引數三:操作,設定訊號量的初始值,呼叫 :SETVAL; 引數四:設定的值,使用二值訊號量用於互斥,一般設為1;

(3):訊號量p操作:獲得訊號量 int semop(int semid,struct sembuf *cat,int num); 引數一:id 引數二:傳入控制該訊號量的方法,為結構體型別 引數三:操作幾個訊號量

struct sembuf
{
    short sem_num;  //設定操作第幾個索引處的訊號量
    short sem_op;   //設定操作方式,p操作為-1
    short sem_flg;   //**一般設為  SEM_UNDO,防止死鎖,這裡很關鍵,如果不設定,預設是IPC_NOWAIT,那麼久無法產生
//互斥,之前筆者在這裡因為互斥問題思考了很久!!! }

(4)訊號量V操作——釋放訊號量

int semop(int semid,struct sembuf *cat,int num);
引數一:id
引數二:傳入控制該訊號量的方法,為結構體型別
struct sembuf
{
    short sem_num;  //設定操作第幾個索引處的訊號量
    short sem_op;   //設定操作方式,p操作為-1
    short sem_flg;   //**一般設為  SEM_UNDO,防止死鎖,這裡很關鍵,如果不設定,預設是IPC_NOWAIT,那麼久無法產生
//互斥,之前筆者在這裡因為互斥問題思考了很久!!! }

(5)刪除訊號量

int semctl(semid,IPC_RMID);

這樣一整套流程就實現了訊號量的操作,互斥操作同一個訊號量即可,注意點是: ①:必須操作同一個訊號量,到這個訊號量使用時,另一個訊號量不能進入共享程式碼段 ②:結構體 sembuf中的sem_flg必須設為 SEM_UNDO,否則不會產生阻塞! ③:讀操作的開啟共享區必須在獲得到訊號量後才可,而且最後只要是對共享區的操作,都放在獲得訊號量之後;否則容易產生爭奪現象。