訊號量學習總結(一)
訊號量是一種用於如果不同程序間或乙個給定程序的不同執行緒間同步的原語。
建立乙個新的有名訊號量或開啟乙個已存在的有名訊號量。
sem_t*sem_open(const char *name, int oflag);
sem_t*sem_open(const char *name, int oflag, mode_t mode, unsigned int value)
oflag:可以是0、o_creat或o_creat |o_excl。
如果指定了o_creat標誌,第三和第四個引數是需要的。mode引數為訊號量許可權位。value引數為訊號量初始值。
int sem_close(sem_t *sem);
關閉乙個訊號量並沒有將它從系統中刪除。
int sem_unlink(const char *name);
等到最後乙個sem_close操作才將訊號量從系統核心中刪除。
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
程序或執行緒使用臨界資源時,測試所指定訊號量的值,如果該值大於0,那就將它減1並立即返回。
如果返回值等於0,呼叫執行緒就被投入睡眠中,直到訊號量值變為大於0,這時再將訊號量值減一,函式隨後返回。
sem_wait和sem_trywait的區別:當訊號量的值已經是0時,sem_trywait並不將呼叫執行緒投入睡眠。它返回乙個eagain錯誤。
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem,int *valp);
程序或執行緒使用完臨界資源後,應該呼叫sem_post函式。
sem_getvalue在由valp指向的整數中返回指定訊號量sem的當前值。如果訊號量當前已上鎖,那麼返回值或為0,或為某個負數,其絕對值就是等待該訊號量解鎖的執行緒數。
1)互斥鎖必須總是由給它上鎖的執行緒解鎖,訊號量的掛出(sem_post操作)卻不必由執行過它的等待操作(sem_wait操作)的同乙個執行緒執行。
2)互斥鎖要麼被解鎖,要麼被解開(二值狀態,類似於二值訊號量)
3)訊號量有乙個與之關聯的狀態(訊號量計數值),因此訊號量掛出操作總是被記住。但是,當向乙個條件變數傳送訊號時,如果沒有執行緒等待在該條件變數上,那麼訊號將丟失。
訊號量Semaphore學習總結
訊號量 semaphore 有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵 段不被併發呼叫。在進入乙個關鍵 段之前,執行緒必須獲取乙個訊號量 一旦該關鍵 段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵 段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這...
Nginx訊號量學習總結
總結如下 訊號選項 含義term int quick shutdown 立即停止 quit 優雅的關閉程序,即等請求結束後再關閉 hup改變配置檔案之後,平滑的重讀配置檔案,即重新讀取新的配置重啟 user1 重讀日誌,在日誌按月 日進行分割時有用,例如每天備份乙個檔案,然後重新建立access.l...
訊號量學習
一 概念 訊號量是乙個整數,這個整數允許多程序或多執行緒同步他們的操作。這個整數必須大於等於0.linux庫函式中,類似有名對映 匿名對映,有名管道 無名管道,訊號量也有有名訊號量和匿名信號量。匿名信號量在記憶體中,不在檔案系統中,一般用於執行緒之間的同步 有名訊號量需要建立檔案,一般用於程序之間的...