#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
#include <fcntl.h>
#include "Queue.h"
#include "const.h"
#define N 5
time_t end_time;
sem_t mutex,full,empty;
int fd;
Queue * qt; //缓冲区
Elemtype p;
void consumer(void *arg);
void productor(void *arg);
int main(int argc, char *argv[])
{
pthread_t id1,id2,id3,id4,id5;
pthread_t mon_th_id;
int ret;
end_time = time(NULL)+30;
qt = InitQueue();
p.lNumber = 1000;
ret=sem_init(&mutex,0,1); //初使化互斥信号量为1
ret=sem_init(&empty,0,N); //初使化empty信号量为N
ret=sem_init(&full,0,0); //初使化full信号量为0
if(ret!=0)
perror("sem_init");
ret=pthread_create(&id1,NULL,(void *)productor, NULL); //生产者线程
if(ret!=0)
perror("pthread cread1");
ret=pthread_create(&id3,NULL,(void *)productor, NULL); //生产者线程
if(ret!=0)
perror("pthread cread3");
ret=pthread_create(&id2,NULL,(void *)consumer, NULL); //消费者线程
if(ret!=0)
perror("pthread cread2");
ret=pthread_create(&id5,NULL,(void *)productor, NULL); //生产者线程
if(ret!=0)
perror("pthread cread5");
ret=pthread_create(&id4,NULL,(void *)consumer, NULL); //消费者线程
if(ret!=0)
perror("pthread cread4");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
pthread_join(id4,NULL);
pthread_join(id5,NULL);
exit(0);
}
void productor(void *arg) //生产者线程
{
int i,nwrite;
while(time(NULL) < end_time)
{
sem_wait(&empty); // p(empty)
sem_wait(&mutex); // p(mutex)
if(TRUE==QueueFull(*qt)) //队满
{
printf("Productor:buffer is full ,please try to write later.\n");
}
else
{
EnQueue(qt,p);
printf("Productor:write [%ld] to buffer \n",p.lNumber);
p.lNumber++;
}
sem_post(&full); //v(full)
sem_post(&mutex); //v(mutex)
sleep(1);
}
} //生产者productor
void consumer(void *arg) //消费者线程
{
int nolock=0;
int ret,nread;
Elemtype p2;
while((time(NULL) < end_time)||(FALSE==(QueueEmpty(*qt))))
{
sem_wait(&full); //p(full)
sem_wait(&mutex); //p(mutex)
if(TRUE==QueueEmpty(*qt)) //队空
{
printf("Consumer:the buffer is empty,please try to read later.\n");
}
else
{
DeQueue(qt,&p2);
printf("Consumer:read [%ld] from buffer.\n",p2.lNumber);
}
sem_post(&empty); //v(empty)
sem_post(&mutex); //v(mutex)
sleep(2);
} //end of while((time(NULL) < end_time)||(FALSE==(QueueEmpty(*qt))))
} //消费者consumer
linux操作系统下进程管理之两个生产者和三个消费者.zip
需积分: 5 126 浏览量
2024-01-20
14:09:23
上传
评论
收藏 3KB ZIP 举报
JJJ69
- 粉丝: 6222
- 资源: 5780
最新资源
- 教学内容及补充-cha7.rar
- 设计1.ms14
- vscode-1.64.1.tar源码文件
- vscode-1.64.0.tar源码文件
- vscode-1.52.0.tar源码文件
- Music-Player +PlayerActivity+ rockplayer+ SeeJoPlayer 播放器JAVA源码
- vscode-1.46.0.tar源码文件
- 最近很火植物大战僵尸杂交版2.08苹果+安卓+PC+防闪退工具V2+修改工具+高清工具+通关存档整合包更新
- 超级好用的截图工具PixPin,可录制Gif图
- Screenshot_2024-05-21-17-06-42-64_2332cb9b27b851b548ba47a91682926c.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈