📄 os_pc.c
字号:
/*
生产者、消费者问题
<i>一个有限缓冲区和两类线程,它们是生产者和消费者,生产者把产品放入缓冲区,相反消费者便是从缓冲区中拿走产品。
生产者在缓冲区满时必须等待,直到缓冲区有空间才继续生产。消费者在缓冲区空时必须等待,直到缓冲区中有产品才能继续读取。
在这个问题上主要考虑的是:缓冲区满、缓冲区空和竞争条件的选择与判断。
empty —— 表示缓冲区是否为空,初值为n.
full —— 表示缓冲区是否为满,初值为0.
mutex - 表示对缓冲区互斥访问加的信号灯,初值为1。
消费者进程内容描述:
consumer(){
while(true){
p(full);
p(mutex);
从缓冲区buffer中取出一个商品;
v(mutex);
v(empty);
消费该产品;
}
}
生产者进程内容描述:
productor(){
while(true){
生产一个产品;
p(empty);
p(mutex);
产品送往缓冲区buffer;
v(mutex);
v(full);
}
}
主函数描述:
main()
{
cobegin
productor();
consumer();
coend
}
*/
#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 10
time_t end_time;
sem_t mutex,full,empty;
Queue *qt; /*缓冲区*/
ElemType p;
void consumer(void *arg);
void productor(void *arg);
int main(int argc, char *argv[])
{
pthread_t id1,id2;
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 id1");
}
ret = pthread_create(&id2,NULL,(void *)consumer, NULL);
if(ret!=0)
{
perror("pthread id2");
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
/*生产者线程*/
void productor(void *arg)
{
while(time(NULL) < end_time){
sem_wait(&empty);/* p(empty) */
sem_wait(&mutex);/*p(mutex)*/
if(QueueFull(*qt) == TRUE)
{
/*队满*/
printf("Productor:buffer is full now, please try to write later.\n");
}
else
{
EnQueue(qt,p);
printf("Productor:write [%d] to buffer \n", p.lNumber);
p.lNumber++;
}
sem_post(&mutex);/*v(mutex)*/
sem_post(&full);/*v(full)*/
sleep(1);
}
}/*productor*/
/*消费者线程*/
void consumer(void *arg)
{
ElemType p2;
while((time(NULL) < end_time)||((QueueEmpty(*qt)) == FALSE))
{
sem_wait(&full);/*p(full)*/
sem_wait(&mutex);/*p(mutex)*/
if(QueueEmpty(*qt) == TRUE)
{
/*队空*/
printf("Consumer:the buffer is empty,please try to read later.\n");
}
else
{
DeQueue(qt,&p2);
printf("Consumer:read [%d] from buffer.\n", p2.lNumber);
}
sem_post(&mutex);/*v(mutex)*/
sem_post(&empty);/*v(empty)*/
sleep(2);
}
}/*consumer*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -