/*
生产者、消费者问题
<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*/
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
os_pc.rar (11个子文件)
os_pc
os_pc
include
typedefine.h 329B
const.h 228B
queue.h 432B
makefile 271B
src
os_pc.c 3KB
queue.c 1KB
typedefine.h 329B
const.h 228B
queue.h 432B
lib
queue.o 1KB
os_pc.o 3KB
共 11 条
- 1
资源评论
- rainystray2014-04-28算是一个小例子吧,还可以把。。。。
- OOXXfree2013-03-20多谢分享,虽然没有用到但是还是灰常感谢
pchuan42
- 粉丝: 1
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- yolov5,SSD 可能使用到的一些代码
- 基于c51单片机+DS1302+DHT11温湿度模块+LCD1602显示的万年历硬件原理图+BOM+软件程源码序+仿真图.zip
- NSGA2的MATLAB代码
- Messagepassingtest_GCN_DGL.py
- Sh,Docker 运维好帮手,一招通过 sh 脚本批量快速启动和重启多个Docker 容器
- PCF2123.pdf
- 打开注册表操作.doc
- Windows 常见运行运行库32+64
- WMJUL8iC.html
- 基于3KW光伏并网单相逆变器设计(TMS320F28035控制板+显示板+STM32F103功率板)硬件(原理图+PCB)工程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功