Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1259909
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: 嵌入式

2012-02-20 15:02:20

    linux下实现两个线程之间的通信
分类: 专业 30人阅读 评论(0) 收藏 举报

 

流程图:

用gcc编译通过(gcc -pthread filename.c)。。。

  1. #include<stdio.h>
  2. #include<memory.h>
  3. #include<pthread.h>
  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;
  58. }

 

http://blog.csdn.net/scnujack/article/details/6438252

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