线程间通讯《代码》pthread_cond_wait/signal

来源:互联网 发布:淘宝买东西后店铺消失 编辑:程序博客网 时间:2024/06/06 17:02
  1. /*
  2.        pthread_cond_wait(&cond,&lock)  函数:将 lock 解锁,再将条件变量 cond 加锁
  3.        pthread_cond_signal( &cond)             函数:将 cond 解锁
  4. */
  5. #include<stdio.h> 
  6. #include<memory.h> 
  7. #include<pthread.h>  
  8. int buf[1000000];  
  9. int w=0,r=0; //r是读指针,w是写指针  
  10. int size=10; //缓冲区大小  
  11. pthread_mutex_t lock//锁  
  12. pthread_cond_t is_empty; //缓冲区是否为空  
  13. pthread_cond_t is_full;  //缓冲区是否已满  
  14. void *sender(void *a)     //发送100个数据  
  15. {  
  16.     int i,j,k;  
  17.     for(i=1;i<=100;i++)   //总共100个数据  
  18.     {  
  19.         pthread_mutex_lock(&lock);  //锁  
  20.         if(w-r>size)     //缓冲区是否已满  
  21.                  pthread_cond_wait(&is_full,&lock);  //满了,等待接受线程把数据取走  
  22.         buf[w++]=i;  //缓冲区有空间,发送  
  23.         printf("%d--->/n",i); //打印出来  
  24.         pthread_cond_signal(&is_empty);  //缓冲区里至少有一个数据,读线程可以把他取走  
  25.         pthread_mutex_unlock(&lock);    //解锁  
  26.     }  
  27.     return ;  
  28. }  
  29. void *receiver(void *a)    //接受数据  
  30. {  
  31.     int x;  
  32.     while(1)  
  33.     {  
  34.         pthread_mutex_lock(&lock);  //锁  
  35.         if(r==w)     //缓冲区是否有数据  
  36.         pthread_cond_wait(&is_empty,&lock);  //没有数据,等待发送线程发数据  
  37.         x=buf[r++];   //有数据了,取走  
  38.         if(x!=0)  
  39.         printf("--->%d/n",x);  //打印出来  
  40.         else  
  41.         break;    //数据发送->接受完了,结束线程  
  42.         pthread_cond_signal(&is_full);  //缓冲区至少还有一个空间可以让发送进程发送数据  
  43.         pthread_mutex_unlock(&lock);     //解锁  
  44.     }  
  45.     return ;  
  46. }  
  47. int main()  
  48. {  
  49.     memset(buf,0,sizeof(buf));  
  50.     pthread_t a,b; //创建两个线程  
  51.     //初始化  
  52.     pthread_mutex_init(&lock,NULL);  
  53.     pthread_cond_init(&is_full,NULL);  
  54.     pthread_cond_init(&is_empty,NULL);  
  55.     //线程开始工作  
  56.     pthread_create(&a,NULL,sender,0);  
  57.     pthread_create(&b,NULL,receiver,0);  
  58.     void *recycle;  //线程结束时,存放回收的数据  
  59.     pthread_join(a,&recycle); //回收资源  
  60.     pthread_join(b,&recycle);  //回收资源  
  61.     return 0;  
  62. }