歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 多線程同步(信號量)

sem_wait函數也是一個原子操作,它的作用是從信號量的值減去一個“1”,但它永遠會先等待該信號量為一個非零值才開始做減法。也就是說,如果你對一個值為2的信號量調用sem_wait(),線程將會繼續執行,這信號量的值將減到1。如果對一個值為0的信號量調用sem_wait(),這個函數就 會地等待直到有其它線程增加了這個值使它不再是0為止。如果有兩個線程都在sem_wait()中等待同一個信號量變成非零值,那麼當它被第三個線程增加 一個“1”時,等待線程中只有一個能夠對信號量做減法並繼續執行,另一個還將處於等待狀態。

sem_post函數的作用是給信號量的值加上一個“1”,它是一個“原子操作”---即同時對同一個信號量做加“1”操作的兩個線程是不會沖突的;而同 時對同一個文件進行讀、加和寫操作的兩個程序就有可能會引起沖突。信號量的值永遠會正確地加一個“2”--因為有兩個線程試圖改變它。

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <pthread.h>   
  5. #include <semaphore.h>   
  6.   
  7. int myglobal;  
  8. sem_t sem;  
  9.   
  10. void * thread_function(void *arg)  
  11. {  
  12.     int i,j;  
  13.     for (i = 0; i < 10; i += 1)  
  14.     {  
  15.         sem_wait(&sem);  
  16.         j = myglobal;  
  17.         j = j+1;  
  18.         printf(".");  
  19.         fflush(stdout);  
  20.         sleep(1);  
  21.         myglobal = j;  
  22.         sem_post(&sem);  
  23.     }  
  24.     return NULL;  
  25. }  
  26.   
  27.   
  28. int main(void)  
  29. {  
  30.     pthread_t mythread;  
  31.     int i;  
  32.   
  33.     sem_init(&sem, 0, 1);//信號量初始化   
  34.     if(pthread_create(&mythread, NULL, thread_function, NULL))  
  35.     {  
  36.         printf("create thread error!\n");  
  37.         abort();  
  38.     }  
  39.   
  40. /*  sleep(1);*/  
  41.   
  42.     for(i = 0; i < 10; i++)  
  43.     {  
  44.         sem_wait(&sem);//=0   
  45.         myglobal = myglobal + 1;  
  46.         printf("o");  
  47.         fflush(stdout);  
  48.         sleep(1);  
  49.         sem_post(&sem);//=1   
  50.     }  
  51.   
  52.     if(pthread_join(mythread, NULL))  
  53.     {  
  54.         printf("waiting thread failed!\n");  
  55.         abort();  
  56.     }  
  57.   
  58.     printf("myglobal equals %d\n",myglobal);  
  59.   
  60.     exit(0);  
  61. }  
Copyright © Linux教程網 All Rights Reserved