#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#define max 5
int queue[max];//产品存取缓冲区
sem_t blank_num;
sem_t product_num;//定义缓冲区空区数量和生产产品数量
void *producer(void *arg)
{
int i=0;
while(1)
{
sem_wait(&blank_num);//空格子未满则减一,
//满了则阻塞等待消费者释放空间
queue[i]=rand()%1000+i;
printf("---producer生产了一个位置为%d的产品%d\n",i,queue[i]);
sem_post(&product_num);//将产品数加一
i=(i+1)%max;//逻辑空间循环
sleep(rand()%3);
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int i=0;
while(1)
{
sem_wait(&product_num);//如果产品没有空则减一
//空了等待生产者生产
printf("---consumer消费了一个位置为%d的产品%d\n",i,queue[i]);
queue[i]=0;
sem_post(&blank_num);//空去数量加1
i=(i+1)%max;
sleep(rand()%2);
}
pthread_exit(NULL);
}
int main()
{
pthread_t pid,cid;
memset(queue,0,sizeof(queue));
//初始化信号量值
sem_init(&blank_num,0,max);//第二参数指定为线程间信号量
sem_init(&product_num,0,0);
pthread_create(&pid,NULL,producer,NULL);
pthread_create(&cid,NULL,consumer,NULL);
pthread_join(pid,NULL);
pthread_join(pid,NULL);
//信号量销毁
sem_destroy(&blank_num);
sem_destroy(&product_num);
pthread_exit(NULL);
}
<生产者消费者模型-C线程信号量机制实现>
最新推荐文章于 2024-03-17 18:56:38 发布