函式:int semop(int id , struct sembuf array, nops);
訊號量優點:比檔案鎖有優勢,效率不是高那麼一點,起碼不用開啟檔案關閉檔案這些耗時間的工作。
缺點:一旦鎖定,若在解鎖之前出現程式崩潰等segment fault問題,將直接導致鎖定的訊號量無法恢復,形成永久占用。
檔案鎖則沒有這個問題,程序的退出將導致檔案描述符關閉,在該描述符上進行的鎖定操作就自行解除了。
辦法解決:在加鎖的時候會有乙個undo的設定,也就是在呼叫semop的時候指定操作結構體當中可以放置乙個undo引數,
通常都是這樣去呼叫的:
semop(isemid, &stlocksem, 1);
其中stlocksem就是定義的乙個操作結構體,原型為:
struct sembuf;
一般定義為:
struct sembuf stlocksem= , stunlocksem=;
這樣的undo選項會讓核心記錄乙個與呼叫程序相關的undo記錄,如果該程序崩潰,則根據這個程序的undo記錄自動恢復相應訊號量的計數值。
不過有個問題:
對於sem_undo來說,核心記錄的資訊是跟程序相關的。乙個程序在lock的時候設定乙個undo,那麼對應該程序的undo計數就多乙個,unlock的時候
設定乙個undo,那麼計數就減乙個。對於臨界區互斥的應用而言,lock和unlock都是在乙個程序當中完成,於是undo可以切實發揮作用。
然而,如果是乙個程序lock,而另乙個程序unlock,那麼使用undo就不起作用了,而且由於都是單邊操作,導致undo計數對單一程序而言,
只朝乙個方向發展,最後必定是超過核心限制值,這時會出現erange的錯誤。
訊號量 二值訊號量
訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...
python訊號量 Python訊號量
python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...
訊號 訊號量
訊號是由 系統或者程序傳送給目標程序的資訊,以通知目標程序某個狀態的改變或系統異常。linux訊號可以由如下條件產生 1 對於前台程序,使用者可以通過輸入特殊的終端字元來給它傳送訊號。比如輸入ctrl c通常或給程序傳送乙個中斷訊號 2 系統異常。比如浮點異常和非法記憶體段訪問。3 系統狀態變化 4...