sem_wait函數也是一個原子操作,它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。也就是說,如果你對一個值為2的信號量調用sem_wait(),線程將會繼續執行,這信號量的值將減到1。如果對一個值為0的信號量調用sem_wait(),這個函數就 會地等待直到有其它線程增加了這個值使它不再是0為止。如果有兩個線程都在sem_wait()中等待同一個信號量變成非零值,那麼當它被第三個線程增加 一個“1”時,等待線程中只有一個能夠對信號量做減法並繼續執行,另一個還將處於等待狀態。
sem_post函數的作用是給信號量的值加上一個“1”,它是一個“原子操作”---即同時對同一個信號量做加“1”操作的兩個線程是不會沖突的;而同 時對同一個文件進行讀、加和寫操作的兩個程序就有可能會引起沖突。信號量的值永遠會正確地加一個“2”--因為有兩個線程試圖改變它。
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <semaphore.h>
-
- int myglobal;
- sem_t sem;
-
- void * thread_function(void *arg)
- {
- int i,j;
- for (i = 0; i < 10; i += 1)
- {
- sem_wait(&sem);
- j = myglobal;
- j = j+1;
- printf(".");
- fflush(stdout);
- sleep(1);
- myglobal = j;
- sem_post(&sem);
- }
- return NULL;
- }
-
-
- int main(void)
- {
- pthread_t mythread;
- int i;
-
- sem_init(&sem, 0, 1);//信號量初始化
- if(pthread_create(&mythread, NULL, thread_function, NULL))
- {
- printf("create thread error!\n");
- abort();
- }
-
- /* sleep(1);*/
-
- for(i = 0; i < 10; i++)
- {
- sem_wait(&sem);//=0
- myglobal = myglobal + 1;
- printf("o");
- fflush(stdout);
- sleep(1);
- sem_post(&sem);//=1
- }
-
- if(pthread_join(mythread, NULL))
- {
- printf("waiting thread failed!\n");
- abort();
- }
-
- printf("myglobal equals %d\n",myglobal);
-
- exit(0);
- }