#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#define BUFFER_SIZE 8
#define MAX_COUNT 20
typedef struct pc_st
{
int buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
pthread_cond_t notfull;
pthread_cond_t notempty;
int write_pos;
int read_pos;
}pc_st;
#define OVER -1
#define PC_ST_INITIALIZER {{OVER,OVER,OVER,OVER,OVER,OVER,OVER,OVER},PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,0,0}
pc_st pc= PC_ST_INITIALIZER;
void put(int data)
{
pthread_mutex_lock(&pc.mutex);
if((pc.write_pos+ 1)%BUFFER_SIZE== pc.read_pos)
pthread_cond_wait(&pc.notfull,&pc.mutex);
pc.buffer[pc.write_pos]= data;
pc.write_pos= (pc.write_pos+ 1)%BUFFER_SIZE;
pthread_cond_signal(&pc.notempty);
pthread_mutex_unlock(&pc.mutex);
}
int get()
{
int value;
pthread_mutex_lock(&pc.mutex);
if(pc.read_pos== pc.write_pos)
pthread_cond_wait(&pc.notempty,&pc.mutex);
value= pc.buffer[pc.read_pos];
pc.read_pos= (pc.read_pos+ 1)%BUFFER_SIZE;
pthread_cond_signal(&pc.notfull);
pthread_mutex_unlock(&pc.mutex);
return value;
}
void* producer(void *arg)
{
int i= 1;
while(i<= MAX_COUNT)
{
put(i);
i++;
}
put(OVER);
}
void* consumer(void *arg)
{
int value;
while(1)
{
value= get();
if(value== OVER)
break;
printf("value= %d\n",value);
sleep(1);
}
}
int main()
{
pthread_t pro_id,con_id;
pthread_create(&pro_id,NULL,producer,NULL);
pthread_create(&con_id,NULL,consumer,NULL);
pthread_join(pro_id,NULL);
pthread_join(con_id,NULL);
return 0;
}
条件变量+互斥锁实现生产者消费者问题
最新推荐文章于 2022-05-01 14:38:39 发布