生产者和消费者的简单的例子:用互斥锁控制

#include<unistd.h>

#include<stdio.h>

#include<pthread.h>

 

#define MAX_SIZE 20

#define BUFFER_SIZE 8

 

struct

{

   pthread_mutex_t mutex;

   pthread_cond_t  nofull;

   pthread_cond_t  noempty;

   int buff[BUFFER_SIZE];

   int nput;  //下标

   int nval;  //值

   int count; //统计生产者存入的数的个数

}shared ={PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER};

 

void* produce(void *arg)

{

   for(;;)

    {

       pthread_mutex_lock(&shared.mutex);

       if(shared.nval >= 20)

       {

           pthread_mutex_unlock(&shared.mutex);

           printf("produce finish.\n");

           break;

       }

       if(shared.count < BUFFER_SIZE) //8

       {

           shared.buff[shared.nput] = shared.nval;

           printf("shared.nput =%d\n",shared.nput);

           shared.nput++;  //下标+1

           if(shared.nput >= BUFFER_SIZE)

           {

                shared.nput = 0;

           }

           shared.nval++ ; //为了方便,假设设置的值是对应的下标 

           shared.count++; //计数++

           pthread_cond_signal(&shared.noempty);

       }

       else

           pthread_cond_wait(&shared.nofull, &shared.mutex); //

       pthread_mutex_unlock(&shared.mutex);

    }

}

void* consume(void *arg)

{

   int j = 0;

   for(int i=0; i<MAX_SIZE;)  //20

   {    

       pthread_mutex_lock(&shared.mutex);

       if(shared.count > 0)

       {

           i++;

           printf("value = %d\n", shared.buff[j]);

           j++;

           if(j >= BUFFER_SIZE)

                j = 0;

           shared.count--;

           pthread_cond_signal(&shared.nofull);

       }

       else

           pthread_cond_wait(&shared.noempty, &shared.mutex);

       pthread_mutex_unlock(&shared.mutex);

    }

}

int main()

{

   pthread_t ptid;

   pthread_t ctid;

 

   pthread_create(&ptid, NULL, produce, NULL);

   pthread_create(&ctid, NULL, consume, NULL);

 

   pthread_join(ptid,NULL);

   pthread_join(ctid,NULL);

 

   return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值