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. }  

相关内容

    暂无相关文章