进程同步完整版

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<process.h>
#include<windows.h>
int N;
int read_write=1;
int write=1;
int read=1;
int court1;
typedef struct thread{
int i;
char state;
int delay;
int run;
struct thread *next;
}add_thread;
add_thread *Threa;
void V(int m);
void init_thread(){
Threa=(add_thread *)malloc(sizeof(add_thread));
Threa->next=NULL;
}
//int resource=10;
void P(int m,int i,int p){
printf("\t\t进程%d等待中......\n\n",m);
Sleep(i*1000);
printf("\t\t进程%d运行中......\n\n",m);
Sleep(p*1000);
}
void V(int m){
printf("\t\t进程%d结束运行......\n\n",m);
//resource+=1;
}
//创建线程数据链表
void rand_thread(add_thread *list,int m){
    srand((int)time(NULL));
    int i=0;
    int k;
    add_thread *p,*temp;
    temp=list;
 for(i;i<m;i++){
p=(add_thread *)malloc(sizeof(add_thread));
p->i=i;
if((k=rand()%100+1)>=50){
p->state='R';
}else{
p->state='W';
}
p->delay=(rand()%10+1);
p->run=(rand()%10+1);
printf("\t\t %d\t  %c\t   %d\t\t   %d\n",p->i,p->state,p->delay,p->run);
p->next=NULL;
temp->next=p;
temp=p;
}
}
int sum_write(){
add_thread *y;
int i;
int court=0;
y=Threa->next;
for(i=0;i<N;i++){
if(y->state=='W') court++;
y=y->next;
}
return court;
}
void run_tow(void *p){
int num,k;
num=N;
add_thread *y;
y=Threa->next;
for(k=0;k<(int)p;k++)
y=y->next;
while(1){
//while(y->state)
if(y->state=='W'&&write==1){
read_write-=1;
write-=1;
P(y->i,y->delay,y->run);
V(y->i);
write+=1;
read_write+=1;
court1--;
break;
}else if(y->state=='R'&&read_write==1&&court1==0){
P(y->i,y->delay,y->run);
V(y->i);
break;
}else Sleep(100);
}
}
void run(void *p){
int num,k=0,l;
num=N;
add_thread *y;
y=Threa->next;
for(k=0;k<(int)p;k++)
y=y->next;
while(1){
if(y->state=='R'&&read==1){
read_write-=1;
l=y->delay;
P(y->i,l,y->run);
V(y->i);
read_write+=1;
break;
}else if(y->state=='W'&&read_write==1){
read-=1;
read_write-=1;
l=y->delay;
P(y->i,l,y->run);
V(y->i);
read+=1;
read_write+=1;
break;
}else{
Sleep(100);
}
}
}
void start_thread(int n,int m){
int i=0;
int hand[50];
if(m==1){
while(i!=N){
if((hand[i]=_beginthread(run, 0, (void *)i))!=-1){
i++;
}
}
}else{
while(i!=N){
if((hand[i]=_beginthread(run_tow, 0, (void *)i))!=-1){
i++;
}
}
}
for(i=0;i<n;i++){
_endthread();
}
}
int main(){
int n;
start:
printf("           进程同步模拟系统          \n\n");
printf("#######################################\n");
printf("#                                     #\n");
printf("#                                     #\n");
printf("#           1、读者优先               #\n");
printf("#                                     #\n");
printf("#                                     #\n");
printf("#           2、写者优先               #\n");
printf("#                                     #\n");
printf("#                                     #\n");
printf("#           3、退出系统               #\n");
printf("#                                     #\n");
printf("#                                     #\n");
printf("#######################################\n");
scanf("%d",&n);
system("cls");
if(n==1){
printf("\t输入要生成的线程数\n\n");
   scanf("%d",&N);
system("cls");
   write=N;
   init_thread();
printf("\t\tPID\tstate\twait time\trun time\n\n");
   rand_thread(Threa,N);
start_thread(N,n);
}else if(n==2){
printf("\t输入要生成的线程数\n\n");
scanf("%d",&N);
system("cls");
   init_thread();
printf("\t\tPID\tstate\twait time\trun time\n\n");
   rand_thread(Threa,N);
court1=sum_write();
//printf("\n\n%d\n\n\n",court1);
start_thread(N,n);
}else if(n==3) return 0;
else{
printf("\n\n\n\n\t\t\t输入错误请重新输入\n\n");
getch();
system("cls");
goto start;
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值