sem_wait是一個函式,也是一個原子操作,它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。也就是說,如果你對一個值為2的信號量調用sem_wait(),執行緒將會繼續執行,將信號量的值將減到1。
如果對一個值為0的信號量調用sem_wait(),這個函式就會原地等待直到有其它執行緒增加了這個值使它不再是0為止。如果有兩個執行緒都在sem_wait()中等待同一個信號量變成非零值,那么當它被第三個執行緒增加 一個“1”時,等待執行緒中只有一個能夠對信號量做減法並繼續執行,另一個還將處於等待狀態。sem_trywait(sem_t *sem)是函式sem_wait的非阻塞版,它直接將信號量sem減1,同時返回錯誤代碼。
基本介紹
- 中文名:sem_wait
- 頭檔案:#include <semaphore.h>
- 函式原型:int sem_wait(sem_t * sem);
- 類別:原子操作
描述
那么進行減一的操作,函式立即返回.
如果信號量當前為0值,那么調用就會一直阻塞直到或者是信號量變得可以進行減一的操作
(例如,信號量的值比0大),或者是信號處理程式中斷調用
那么sem_trywait()就會返回一個錯誤(錯誤號是AGAIN)而不是鎖定.
sem_timedwait() 和 sem_wait()是一樣的,除了如果減一操作不能立即執行的話,
abs_timeout 指定了調用應該被阻塞的時間限制.
abs_timeout 參數指向了一個結構體指定了由秒和納秒組成的絕對的逾時值:
從1970-01-01 00:00:00 +0000紀元開始的UTC,結構體的定義如下:
struct timespec
{
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds [0 .. 999999999] */
};
如果逾時值已經超過了調用規定的值,那么信號量不能被立即鎖定,
之後sem_timedwait() 為逾時失敗(error設定為ETIMEDOUT).
更進一步的是,在這種情況下abs_timeout值的有效性都不會檢查.
返回值
錯誤
//調用被信號處理中斷
//sem不是有效的信號量
//下面的錯誤是sem_trywait()可能發生的: