信號量的主要函數有:
int sem_init(sem_t *sem,int pshared,unsigned int value); int sem_wait(sem_t *sem); int sem_post(sem_t *sem);
sem_init用於對指定信號初始化,pshared為0,表示信號在當前進程的多個線程之間共享,value表示初始化信號的值。
sem_wait可以用來阻塞當前線程,直到信號量的值大於0,解除阻塞。解除阻塞后,sem的值-1,表示公共資源被執行減少了。例如:如果你對一個值為2的信號量調用sem_wait(),線程將會繼續執行,信號量的值將-1。當初始化value=0后,使用sem_wai會阻塞這個線程,這個線程函數就會等待其它線程函數調用sem_post增加了了這個值使它不再是0,才開始執行,然后value值-1。
sem_post用於增加信號量的值+1,當有線程阻塞在這個信號量上時,調用這個函數會使其中的一個線程不在阻塞,選擇機制由線程的調度策略決定。
下面是例程:
#include <stdio.h> #include <semaphore.h> sem_t sem; void* func1(void) { sem_wait(&sem); int *running=arg; printf("thread running1\n"); printf("%d\n",*running); } void* func2(void* arg) { printf("pthread2 running\n"); sem_post(&sem); } int main() { sem_init(&sem,0,0); pthread_t thread[2]; int a=5; pthread_create(&(thread[0]),NULL,(void*)func,(void*)&a); printf("main thread running\n"); sleep(10); pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a); printf("main thread running2\n"); pthread_join(thread[0],NULL); pthread_join(thread[1],NULL); sem_destory(&sem); }
運行結果為:
func1被阻塞,直到fun2把信號量+1,才開始執行。
main pthread running main pthread running pthread2 running pthread1 running 5