用C语言编写程序:生产者和消费者之间实现同步与互斥问题

用C语言编写程序:生产者和消费者之间实现同步与互斥问题,第1张

//整个程序以伪代码形式给出,当做一个提示吧,这样你同学就应该有思路了

//程序中有注释部分和需要他自己完善的部分,我给的是框架

//老师只是要求用C程序模拟这个机制来实现,就是通过你所学的知识模拟一个效果即可

//利用P,V *** 作使得在同一时刻,生产者和消费者只能有一个对存储区 *** 作(即临界区)。

//如果陪差两者同时对存储区 *** 作,即同时取和生产的话,必定会有一个等待,当另一个完成 *** 作后自己才会被唤醒。

//生产者在存储区满时不能再生产,进入等待,消费者同理

//完成同步互斥效果

//希望对你朋友有启发

/*----以下为代码部分-----*/

//定义全局变笑乱樱量

int empty = 1//信号量表示存储单元空,可以生产产品

int full = 0//信号量表示存储单元空,不可以消费产品

//P *** 作

void P(int &mutex)

{

*mutex--

if(*mutex<0)

{

//当前进程挂起的程序实现

}

}

//V *** 作

void V(int &mutex)

{

*mutex++

if(*mutex <=0)

{

//唤醒等待中的进程程序实现

}

}

//生产者程序

void producer()

{

P(&empty)//若此时存储区空,则可以生产,否则程序挂起等待

//生产一个产品 *** 作

V(&full)//通知消费者进程,可以取产品

}

//消费者程序

void consumer(){

P(&full)//若此时存储区不空,则可以取产品,否则消费者程序挂起等待

//取走一个产品 *** 作

V(&empty)//通知生产者进程可以生产

}

//主函数

void main()

{

//分别调用生产者,消费者程序,顺序不限,因为已经完成碰丛信号量的同步,若发生同步问题就会等待

producer();

consumer();

consumer();

producer();

………………

}

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

struct PCB {

char NAME[10] /*进程名*/

int ROUND /*进程轮转时间片*/

int REACHTIME /*进程到达时间*/

int CPUTIME /*进程占用CPU时间*/

int COUNT /*计数器*/

int NEEDTIME /*进程完成还要的CPU时间*/

char STATE /*进程的状态*/

struct PCB *NEXT /*链指针*/

}

struct LINK { /*PCB的链结构*/

struct PCB *RUN /*当前运行进程指针*/

struct PCB *READY /*就绪队列头指针*/

struct PCB *TAIL /*就绪队碧姿列尾指针*/

struct PCB *FINISH /*完成队列头指针*/

}

void INIT(LINK *) /*对PCB的链结构初始化*/

void INSERT(LINK *) /*将执行了一个单位时间片数且还未完成的进程的PCB插到就绪队列的队尾*/

void FIRSTIN(LINK *) /*将就绪队列中的第一个进程投入运行*/

void PRINT(LINK *) /*打印每执行一个时间片后的所有空慧带进程的状态*/

void PR(PCB *) /*打印一个进程的状态*/

int CREATE(LINK *,int) 斗芦/*创建新的进程*/

void ROUNDSCH(LINK *) /*按时间片轮转法调度进程*/

void main() {

LINK pcbs

int i

INIT(&pcbs)

i=0

printf("创建5个进程\n\n")

while(i<5) {

if(CREATE(&pcbs,i+1)==1) {

printf("进程已创建\n\n")

i++

}

else

printf("进程创建失败\n\n")

}

FIRSTIN(&pcbs)

ROUNDSCH(&pcbs)

}

void ROUNDSCH(LINK *p) {

PCB *pcb

while(p->RUN!=NULL) {

pcb=(PCB *)malloc(sizeof(PCB))

strcpy(pcb->NAME,p->RUN->NAME)

pcb->ROUND=p->RUN->ROUND

pcb->REACHTIME=p->RUN->REACHTIME

pcb->CPUTIME=p->RUN->CPUTIME

pcb->COUNT=p->RUN->COUNT

pcb->NEEDTIME=p->RUN->NEEDTIME

pcb->STATE=p->RUN->STATE

pcb->NEXT=p->RUN->NEXT

pcb->CPUTIME++

pcb->NEEDTIME--

pcb->COUNT++

if(pcb->NEEDTIME==0) {

pcb->NEXT=p->FINISH->NEXT

p->FINISH->NEXT=pcb

pcb->STATE='F'

p->RUN=NULL

if(p->READY!=p->TAIL)

FIRSTIN(p)

}

else {

p->RUN=pcb

if(pcb->COUNT==pcb->ROUND) {

pcb->COUNT=0

if(p->READY!=p->TAIL) {

pcb->STATE='W'

INSERT(p)

FIRSTIN(p)

}

}

}

PRINT(p)

}

}

void INIT(LINK *p) {

p->RUN=NULL

p->TAIL=p->READY=(PCB *)malloc(sizeof(PCB))

p->READY->NEXT=NULL

p->FINISH=(PCB *)malloc(sizeof(PCB))

p->FINISH->NEXT=NULL

}

int CREATE(LINK *p,int n) {

PCB *pcb,*q

pcb=(PCB *)malloc(sizeof(PCB))

flushall()

printf("请输入第%d个进程的名称:\n",n)

gets(pcb->NAME)

printf("请输入第%d个进程的轮转时间片数:\n",n)

scanf("%d",&(pcb->ROUND))

printf("请输入第%d个进程的到达时间:\n",n)

scanf("%d",&(pcb->REACHTIME))

pcb->CPUTIME=0

pcb->COUNT=0

printf("请输入第%d个进程需运行的时间片数:\n",n)

scanf("%d",&(pcb->NEEDTIME))

pcb->STATE='W'

pcb->NEXT=NULL

if(strcmp(pcb->NAME,"")==0||pcb->ROUND<=0||pcb->NEEDTIME<=0) /*输入错误*/

return 0

q=p->READY

while(q->NEXT!=NULL&&q->NEXT->REACHTIME<=pcb->REACHTIME)

q=q->NEXT

pcb->NEXT=q->NEXT

q->NEXT=pcb

if(pcb->NEXT==NULL)

p->TAIL=pcb

return 1

}

void FIRSTIN(LINK *p) {

PCB *q

q=p->READY->NEXT

p->READY->NEXT=q->NEXT

q->NEXT=NULL

if(p->READY->NEXT==NULL)

p->TAIL=p->READY

q->STATE='R'

p->RUN=q

}

void INSERT(LINK *p) {

PCB *pcb

pcb=(PCB *)malloc(sizeof(PCB))

strcpy(pcb->NAME,p->RUN->NAME)

pcb->ROUND=p->RUN->ROUND

pcb->REACHTIME=p->RUN->REACHTIME

pcb->CPUTIME=p->RUN->CPUTIME

pcb->COUNT=p->RUN->COUNT

pcb->NEEDTIME=p->RUN->NEEDTIME

pcb->STATE=p->RUN->STATE

pcb->NEXT=p->RUN->NEXT

p->TAIL->NEXT=pcb

p->TAIL=pcb

p->RUN=NULL

pcb->STATE='W'

}

void PRINT(LINK *p) {

PCB *pcb

printf("执行一个时间片后的所有进程的状态:\n\n")

if(p->RUN!=NULL)

PR(p->RUN)

if(p->READY!=p->TAIL) {

pcb=p->READY->NEXT

while(pcb!=NULL) {

PR(pcb)

pcb=pcb->NEXT

}

}

pcb=p->FINISH->NEXT

while(pcb!=NULL) {

PR(pcb)

pcb=pcb->NEXT

}

}

void PR(PCB *p) {

printf("进程名:%s\n",p->NAME)

printf("进程轮转时间片:%d\n",p->ROUND)

printf("进程到达时间:%d\n",p->REACHTIME)

printf("进程占用CPU时间:%d\n",p->CPUTIME)

printf("计数器:%d\n",p->COUNT)

printf("进程完成还要的CPU时间:%d\n",p->NEEDTIME)

printf("进程的状态:%c\n\n",p->STATE)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12498515.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存