sem_wait

sem_wait

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);
  • 類別原子操作
描述,返回值,錯誤,注意,範例,

描述

sem_wait() 減小(鎖定)由sem指定的信號量的值.如果信號量的值比0大,
那么進行減一的操作,函式立即返回.
如果信號量當前為0值,那么調用就會一直阻塞直到或者是信號量變得可以進行減一的操作
(例如,信號量的值比0大),或者是信號處理程式中斷調用
sem_trywait() 和 sem_wait()是一樣的,除了如果不能夠對信號量立即進行減一,
那么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).
如果操作立即生效,那么sem_timedwait() 永遠不會返回逾時的錯誤,不管abs_timeout的值.
更進一步的是,在這種情況下abs_timeout值的有效性都不會檢查.

返回值

所有的函式成功返回0,錯誤的話信號量的值不改動,返回-1.errno設定來標識錯誤.

錯誤

EINTR The call was interrupted by a signal handler; see signal(7).
//調用被信號處理中斷
EINVAL sem is not a valid semaphore.
//sem不是有效的信號量
The following additional error can occur for sem_trywait():
//下面的錯誤是sem_trywait()可能發生的:

相關詞條

熱門詞條

聯絡我們