天天看點

程序&線程間通信:信号量

參考文檔:http://blog.csdn.net/evsqiezi/article/details/8061176

頭檔案:#include<semaphore.h>

int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));

sem為指向信号量結構的一個指針;pshared不為0時此信号量在程序間共享,否則隻能為目前程序的所有線程共享;value給出了信号量的初始值。

int sem_post(sem_t *sem);

用來增加信号量的值。當有線程阻塞在這個信号量上時,調用這個函數會使其中的一個線程不在阻塞,選擇機制同樣是由線程的排程政策決定的

成功時傳回 0;錯誤時,信号量的值沒有更改,-1 被傳回,并設定errno 來指明錯誤

int sem_wait(sem_t * sem);

sem_wait函數也是一個原子操作,它的作用是從信号量的值減去一個“1”,但它永遠會先等待該信号量為一個非零值才開始做減法。也就是說,如果你對 一個值為2的信号量調用sem_wait(),線程将會繼續執行,介信号量的值将減到1。如果對一個值為0的信号量調用sem_wait(),這個函數就 會地等待直到有其它線程增加了這個值使它不再是0為止

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

函數sem_trywait ( sem_t *sem )是函數sem_wait()的非阻塞版本,它直接将信号量sem的值減一。在成功完成之後會傳回零。其他任何傳回值都表示出現了錯誤。

int sem_destroy (sem_t *sem);

用來釋放信号量sem,屬于無名信号量。 

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參數指定信号燈的初始值,通常用來指定共享資源的書面。該初始不能超過SEM_VALUE_MAX,這個常值必須低于為32767。二值信号燈的初始值通常為1,計數信号燈的初始值則往往大于1。

int sem_close(sem_t *sem);

關閉有名信号燈。若成功則傳回0,否則傳回-1。一個程序終止時,核心還對其上仍然打開着的所有有名信号燈自動執行這樣的信号燈關閉操作。不論該程序是自願終止的還是非自願終止的,這種自動關閉都會發生。但應注意的是關閉一個信号燈并沒有将他從系統中删除。

int sem_unlink(const char *name);

若成功則傳回0,否則傳回-1。有名信号燈使用sem_unlink從系統中删除。每個信号燈有一個引用計數器記錄目前的打開次數,sem_unlink必須等待這個數為0時才能把name所指的信号燈從檔案系統中删除。也就是要等待最後一個sem_close發生。

繼續閱讀