#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#define HOUSE_MAX 50
// 栈结构
char house[HOUSE_MAX] = {};
// 栈顶下标
int top = 0;
// 互斥量(确保只有一个线程访问栈顶)
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 满仓条件变量(满仓时生产线程睡入)
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
// 空仓条件变量(空仓时消费线程睡入)
pthread_cond_t null = PTHREAD_COND_INITIALIZER;
// 显示仓库
void show_house(char* who,char* op,char ch)
{
printf("%s:",who);
for(int i=0; i<=top; i++)
{
printf("%c",house[i]);
}
printf("%s%c\n",op,ch);
}
// 生产者线程
void* production(void* arg)
{
char* who = (char*)arg;
for(;;)
{
char ch = 'A' + rand() % 26;
pthread_mutex_lock(&mutex);
//醒来后要再次检查是否满仓
while(HOUSE_MAX <= top)
{
printf("%s:满仓\n",who);
pthread_cond_wait(&full,&mutex);
}
show_house(who,"<-",ch);
// 入仓数据
house[top++] = ch;
usleep(rand()%100000);
// 已经确保仓库不空,通知消费
pthread_cond_signal(&null);
// 解锁
pthread_mutex_unlock(&mutex);
// 模拟现实情况
usleep(rand()%100000);
}
return NULL;
}
// 消费者线程
void* consume(void* arg)
{
char* who = (char*)arg;
for(;;)
{
// 加锁
pthread_mutex_lock(&mutex);
// 检查仓库中是否空的
while(0 == top)
{
printf("%s:空仓\n",who);
pthread_cond_wait(&null,&mutex);
}
// 消费数据
char ch = house[--top];
show_house(who,"->",ch);
usleep(rand()%100000);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
usleep(rand()%100000);
}
}
int main()
{
srand(time(NULL));
pthread_t pid[10] = {};
pthread_create(&pid[0],NULL,production,"生产1");
pthread_create(&pid[1],NULL,consume,"消费1");
pthread_create(&pid[2],NULL,production,"生产2");
pthread_create(&pid[3],NULL,consume,"消费2");
pthread_create(&pid[4],NULL,production,"生产3");
pthread_create(&pid[5],NULL,consume,"消费3");
pthread_create(&pid[6],NULL,production,"生产4");
pthread_create(&pid[7],NULL,consume,"消费4");
pthread_create(&pid[8],NULL,production,"生产5");
pthread_create(&pid[9],NULL,consume,"消费5");
for(int i=0; i<10; i++)
{
pthread_join(pid[i],NULL);
}
}
线程:生产者与消费者问题
最新推荐文章于 2021-06-10 14:49:58 发布