POSIX信號量是另一種信號量的實現.它的定義和功能有System V信號量基本一樣,不同的是這組信號量函數的名字已“sem_”開頭.基本的系統該調用有四個:sem_init(),sem_wait(),sem_post()和sem_destory().
系統調用sem_init()
該系統該調用的作用是對由sem指定的信號量進行初始化.其原型:
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared , unsigned value);
參數sem:指向一個用於同步的信號量結構,該結構通常為一個長整形的數;
參數pshared:表示信號量的類型,由於目前linux值支持進程內的信號量,該值只能取0;
參數value:表示信號量的初始化值.
系統調用sem_wait()
該函數阻塞當前線程直到信號量sem的值大於0,也就是說,如果對一個值為2的信號量調用sem_wait()線程將會繼續執行,但信號量的值將減到1.其原型:
#include <semaphore.h>
int sem_wati(sem_t *sem);
如果對一個值為0的信號量調用sem_wait(),這個函數就會等待直到有其他線程增加了這個值使它不再是0為止.如果有兩個線程都在sem_wait()中等待同一個信號量變成非0值,那麼當它被第三個線程增加一個“1”時,等待線程中只有一個能夠對信號量做減法並繼續執行,另外一個還將處於等待狀態.若調用成功則返回0,否則返回-1.參數sem指向一個用於同步的信號量結構.
系統調用sem_post()
該函數用來增加信號量的值,其原型為:
#include <semaphore.h>
int sem_post(sem_t *sem);
當有線程阻塞在這個信號量上時,調用這個函數會使其中的一個線程不再阻塞.具體說來,sem_post()函數的作用是給信號量的加一個“1”,它是一個原子操作,即同時對同一個信號量做加“1”操作的兩個線程是不會沖突的,信號量的值會正確地加上一個“2”.若調用成功則返回0,否則返回-1.參數sem指向一個用於同步的信號量結構.
系統調用sem_destory()函數
該函數用來釋放信號量sem.其原型:
#include <semaphore.h>
int sem_destory(sem_t *sem);
若調用成功則返回0,否則返回-1.參數sem指向一個用於同步的信號量結構.