Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300685
  • 博文数量: 71
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 564
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-20 18:15
个人简介

用编程改变大众。。。

文章分类

全部博文(71)

文章存档

2016年(7)

2015年(54)

2014年(10)

我的朋友

分类: C/C++

2015-06-05 14:37:23

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

阅读(2291) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~