#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>
#define NUM 5
sem_t product_number,blank_number;//定义两个信号量,生产物品数量和剩余可生产产品空间数
int queue[NUM];//定义一个队列(模拟生产出来装物品的容器,亦是消费者消费的物品的容器)
void* product_func(void* arg)//生产者回调函数
{
int i=0;//定义一个数组下标
while(1)
{
sem_wait(&blank_number);//将可生产产品空间数减1,若为0则阻塞等待
queue[i]=rand() %100 +1;//模拟生产产品出来
sem_post(&product_number);//将生产的产品放入容器,生产数量+1
printf("生产了一个产品放%d号格子\n",i);
i = (i+1)%NUM;//将数组下标+1,到5就循环
sleep(rand()%3);
}
}
void* customer_func(void* arg)
{
int i = 0 ;
while(1)
{
sem_wait(&product_number);//判断有没有产品,有就-1,没有就阻塞等待
printf("消费掉的产品为%d\n",i);
queue[i]=0;//消费了后将对应队列元素清空
sem_post(&blank_number);//空格子数+1
i = (i+1)%NUM;
sleep(rand()%3);
}
}
int main(void)
{
pthread_t pid,cid;
sem_init(&product_number,0,0);//初始化产品信号量
sem_init(&blank_number,0,5);//初始化空格子数信号量
pthread_create(&pid,NULL,product_func,NULL);//创建生产者
pthread_create(&cid,NULL,customer_func,NULL);//创建消费者
pthread_join(pid,NULL);//阻塞等待线程返回
pthread_join(cid,NULL);
sem_destroy(&product_number);//销毁信号量
sem_destroy(&blank_number);
return 0;
}
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
生产了一个产品放1号格子
消费掉的产品为0
生产了一个产品放2号格子
消费掉的产品为1
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
生产了一个产品放3号格子
消费掉的产品为2
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
生产了一个产品放1号格子
生产了一个产品放2号格子
消费掉的产品为0
消费掉的产品为1
生产了一个产品放3号格子
消费掉的产品为2
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子