Linux下的信号量----生产者与消费者

关于信号量的函数:

初始化信号量                  int sem_init (sem_t *sem, int pshared, unsigned int value) 

        第一个参数是信号量;第二个参数pshared设为0,意思是信号量用于同一进程间同步;第三个参数value是计数器的初始值。

P操作                               int sem_wait (sem_t *sem)

V操作                               int sem_post (sem_t *sem)         

删除信号量                     int sem_destory (sem_t *sem)

生产者与消费者模型则复合321原则:三种关系,两种角色,一种交易场所

三种关系:

           生产者与消费者:互斥,同步

           生产者与生产者:互斥

           消费者与消费者:互斥


测试代码如下:

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<semaphore.h>
  4 
  5 int ring[64];
  6 sem_t semblank;
  7 sem_t semdata;
  8 
  9 
 10 void * con(void* arg)
 11 {
 12     int step=0;
 13     while(1)
 14     {
 15         sem_wait(&semdata);
 16         int data=ring[step];
 17         step++;
 18         step %= 64;
 19         printf("con done:%d\n",data);
 20         sem_post(&semblank);
 21//       sleep(2);
 22     }
 23 }
 24 
 25 void * pro(void* arg)
 26 {
 27     int step=0;
 28     while(1)
 29     {
 30         sem_wait(&semblank);
 31         int data=rand()%1234;
 32         ring[step]=data;
 33         step++;
 34         step%=64;
 35         printf("pro don:%d\n",data);
 36         sem_post(&semdata);
 37 //      sleep(2);
 38     }
 39 }
 40 int main()
 41 {
 42     sem_init(&semblank,0,64);
 43     sem_init(&semdata,0,0);
 44     pthread_t conr,pror;
 45     pthread_create(&conr,NULL,con,NULL);
 46     pthread_create(&pror,NULL,pro,NULL);
 47 
 48     pthread_join(conr,NULL);
 49     pthread_join(pror,NULL);
 50     sem_destroy(&semblank);
 51     sem_destroy(&semdata);
 52 
 53     return 0;
 54 }
                             

运行现象是生产几次消费几次



可以在此代码的基础上测试两种情况

(1)生产者pror在V操作后sleep 2秒,现象是生产一次,消费一次;

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<semaphore.h>
  4 
  5 int ring[64];
  6 sem_t semblank;
  7 sem_t semdata;
  8 
  9 
 10 void * con(void* arg)
 11 {
 12     int step=0;
 13     while(1)
 14     {
 15         sem_wait(&semdata);
 16         int data=ring[step];
 17         step++;
 18         step %= 64;
 19         printf("con done:%d\n",data);
 20         sem_post(&semblank);
 21//       sleep(2);
 22     }
 23 }
 24 
 25 void * pro(void* arg)
 26 {
 27     int step=0;
 28     while(1)
 29     {
 30         sem_wait(&semblank);
 31         int data=rand()%1234;
 32         ring[step]=data;
 33         step++;
 34         step%=64;
 35         printf("pro don:%d\n",data);
 36         sem_post(&semdata);
 37         sleep(2);
 38     }
 39 }
 40 int main()
 41 {
 42     sem_init(&semblank,0,64);
 43     sem_init(&semdata,0,0);
 44     pthread_t conr,pror;
 45     pthread_create(&conr,NULL,con,NULL);
 46     pthread_create(&pror,NULL,pro,NULL);
 47 
 48     pthread_join(conr,NULL);
 49     pthread_join(pror,NULL);
 50     sem_destroy(&semblank);
 51     sem_destroy(&semdata);
 52 
 53     return 0;
 54 }

(2)消费者在V操作后sleep 2秒,现象是一瞬间生产很多,然后消费一次,生产一次;

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<semaphore.h>
  4 
  5 int ring[64];
  6 sem_t semblank;
  7 sem_t semdata;
  8 
  9 
 10 void * con(void* arg)
 11 {
 12     int step=0;
 13     while(1)
 14     {
 15         sem_wait(&semdata);
 16         int data=ring[step];
 17         step++;
 18         step %= 64;
 19         printf("con done:%d\n",data);
 20         sem_post(&semblank);
 21         sleep(2);
 22     }
 23 }
 24 
 25 void * pro(void* arg)
 26 {
 27     int step=0;
 28     while(1)
 29     {
 30         sem_wait(&semblank);
 31         int data=rand()%1234;
 32         ring[step]=data;
 33         step++;
 34         step%=64;
 35         printf("pro don:%d\n",data);
 36         sem_post(&semdata);
 37 //      sleep(2);
 38     }
 39 }
 40 int main()
 41 {
 42     sem_init(&semblank,0,64);
 43     sem_init(&semdata,0,0);
 44     pthread_t conr,pror;
 45     pthread_create(&conr,NULL,con,NULL);
 46     pthread_create(&pror,NULL,pro,NULL);
 47 
 48     pthread_join(conr,NULL);
 49     pthread_join(pror,NULL);
 50     sem_destroy(&semblank);
 51     sem_destroy(&semdata);
 52 
 53     return 0;
 54 }


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值