📄 hm.cpp
字号:
//#include <windows.h>
//#include <conio.h>
#include <wtypes.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXTHRE 10 //最大线程数
#define PARA 10 //最大线程参数
#define MAXBUF 10 //最大缓冲区间数
struct Trdif
{
int id;
char kind;
int time;
int num[PARA];
};
static struct Trdif Thread_Info[MAXTHRE]={0};//{{1,'P',9,0,0,0},{2,'P',4,0,0,0},{3,'P',2,0,0,0},{4,'C',3,1,3,2}};
int Buffer[MAXBUF]={0};
HANDLE hMutex;
HANDLE thread[MAXTHRE];
HANDLE empty;
CRITICAL_SECTION pcc[MAXBUF];
HANDLE hsema[MAXTHRE];
int need[MAXTHRE];///未写
int x;
DWORD WINAPI pwork(LPVOID arg)
{
int i;
struct Trdif *N =(struct Trdif *)arg;
Sleep(1000*(N->time));
printf("%d say: i need buffer~\n",N->id);
WaitForSingleObject(empty,INFINITE);
WaitForMultipleObjects(1,&hMutex,1,INFINITE);
printf("%d say: i'm writting now.\n",N->id);
for(i=0;i<MAXBUF;i++)
{
if(Buffer[i]==0)
{
Buffer[i]=N->id;
Sleep(1000);
break;
}
}
printf("%d say: i'm over now~,the %d product in the %d buffer!\n",N->id,N->id,i+1);
ReleaseMutex(hMutex);
ReleaseSemaphore(hsema[N->id],1,NULL);
ExitThread(0);
return TRUE;
}
DWORD WINAPI cwork(LPVOID arg)
{
int i=0,a;
struct Trdif *N =(struct Trdif *)arg;
Sleep(1000*(N->time));
while(N->num[i]!=0)
{
printf("%d say: i want the %d product~\n",N->id,N->num[i]);
WaitForSingleObject(hsema[N->num[i]],INFINITE);
for(a=0;a<MAXBUF;a++)
{
if(N->num[i]==Buffer[a])
{
break;
}
}
printf("%d say: i begin use the %d product in the %d buffer!\n",N->id,N->num[i],a+1);
EnterCriticalSection(&pcc[N->num[i]]);
need[N->num[i]]--;
if(!need[N->num[i]])
{
Buffer[a]=0;
ReleaseSemaphore(empty,1,NULL);
printf("%d say: Nobody need the %d buffer now,i release it.\n",N->id,a+1);
}
Sleep(1000);
LeaveCriticalSection(&pcc[N->num[i]]);
printf("%d say: i have used the %d product.\n",N->id,N->num[i]);
i++;
}
ExitThread(0);
return TRUE;
}
DWORD WINAPI fre(LPVOID arg) //
{
ExitThread(0);
return TRUE;
}
int init(struct Trdif *Thread_Info)
{
int a,r=2;
printf("Model = ");
for(;r!=0;r--)
{
scanf("%c",&(Thread_Info->kind));
}
printf("Sleep Time = ");
scanf("%d",&(Thread_Info->time));
switch(Thread_Info->kind)
{
case'p': Thread_Info->kind='P';
case'P': a=1;break;
case'c': Thread_Info->kind='C';
case'C': a=0;break;
default: return 1 ;
}
if(a==0)
{
printf("Please key in the Parameters.Note the Deadlock.Key in the 0 to next.\n");
for(a=0;a<PARA;a++)
{
printf("The Parameter %d = ",a+1);
scanf("%d",&(Thread_Info->num[a]));
if(Thread_Info->num[a]<1)
{
Thread_Info->num[a]=0;
break;
}
need[Thread_Info->num[a]]++;
}
}
return 0;
}
void save()
{
FILE *fp;
int all,m,x;
char temp[8];
if((fp=fopen("exm.txt","w"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for(x=0;x<MAXTHRE;x++)
{
if(Thread_Info[x].id==0)
break;
}
all=x;
itoa(all,temp,10);
fputs(temp,fp);
fputc('\n',fp);
for(x=0;x<all;x++)
{
itoa(Thread_Info[x].id,temp,10);
fputs(temp,fp);
fputc(' ',fp);
fputc(Thread_Info[x].kind,fp);
fputc(' ',fp);
itoa(Thread_Info[x].time,temp,10);
fputs(temp,fp);
fputc(' ',fp);
for(m=0;m<PARA;m++)
{
itoa(Thread_Info[x].num[m],temp,10);
fputs(temp,fp);
fputc(' ',fp);
}
fputc('\n',fp);
}
fclose(fp);
}
void load()
{
FILE *fp;
char temp[8];
long c;
int i,all,m,k;
if((fp=fopen("exm.txt","r"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
k=0;
c=ftell(fp);
while(1)
{
temp[0]=fgetc(fp);
if(temp[0]<'0'||temp[0]>'9')
break;
k++;
}
fseek(fp,c,0);
fgets(temp,k+1,fp);
all=atoi(temp);
fgetc(fp);
for(i=0;i<all;i++)
{
if(feof(fp))
break;
k=0;
c=ftell(fp);
while(1)
{
temp[0]=fgetc(fp);
if(temp[0]<'0'||temp[0]>'9')
break;
k++;
}
fseek(fp,c,0);
fgets(temp,k+1,fp);
Thread_Info[i].id=atoi(temp);
fgetc(fp);
Thread_Info[i].kind=fgetc(fp);
fgetc(fp);
switch(Thread_Info[i].kind)
{
case'p': Thread_Info[i].kind='P';break;
case'P': break;
case'c': Thread_Info[i].kind='C';break;
case'C': break;
default: printf("file error!!\n");exit(0);
}
k=0;
c=ftell(fp);
while(1)
{
temp[0]=fgetc(fp);
if(temp[0]<'0'||temp[0]>'9')
break;
k++;
}
fseek(fp,c,0);
fgets(temp,k+1,fp);
Thread_Info[i].time=atoi(temp);
fgetc(fp);
for(m=0;m<PARA;m++)
{
k=0;
c=ftell(fp);
while(1)
{
temp[0]=fgetc(fp);
if(temp[0]<'0'||temp[0]>'9')
break;
k++;
}
fseek(fp,c,0);
fgets(temp,k+1,fp);
Thread_Info[i].num[m]=atoi(temp);
need[Thread_Info[i].num[m]]++;
fgetc(fp);
}
fgetc(fp);
}
}
int main(int argc, char *argv[])
{
int x;
int flag=0,n=0,chack;
printf("Get the Info from 1.File or 2.Keyboard?\n[1.File/2.Keyboard]");
scanf("%d",&chack);
if(chack==2)
{
while (!flag)
{
system("cls");
printf("Creating Thread...\nCurrent Thread's ID = %d\nKeyin it's Info:\n",n+1);
Thread_Info[n].id=n+1;
chack=init(&Thread_Info[n]);
printf("ID Model SleepT Parameters\n");
printf("%d %d %c %d ",n,Thread_Info[n].id,Thread_Info[n].kind,Thread_Info[n].time);
for(int a=0;a<PARA;a++)
{
if(Thread_Info[n].num[a]==0)
break;
printf("%d ",Thread_Info[n].num[a]);
}
printf("\nIt is the last one Thread?[1.yes/0.no]");
scanf("%d",&flag);
n++;
n=n-chack;
}
save();
}
else if (chack==1)
{
load();
}
system("cls");
hMutex = CreateMutex(NULL,FALSE,NULL);
empty = CreateSemaphore(NULL,MAXBUF,MAXBUF+1,NULL);
for(x=0;x<MAXTHRE;x++)
{
hsema[x] = CreateSemaphore(NULL,0,MAXBUF+1,NULL);
}
for(x=0;x<MAXBUF;x++)
{
InitializeCriticalSection(&pcc[x]);
}
printf("ID Model SleepT Parameters\n");
for(x=0;x<MAXTHRE;x++)
{
if(Thread_Info[x].id==0)
break;
switch(Thread_Info[x].kind)
{
case 'P':thread[x] = CreateThread(NULL,0,pwork,&Thread_Info[x],0,NULL); break;
case 'C':thread[x] = CreateThread(NULL,0,cwork,&Thread_Info[x],0,NULL); break;
default: printf("error!!");return 0;
}
printf("%d %c %d ",Thread_Info[x].id,Thread_Info[x].kind,Thread_Info[x].time);
for(int a=0;a<PARA;a++)
{
if(Thread_Info[x].num[a]==0)
break;
printf("%d ",Thread_Info[x].num[a]);
}
printf("\n");
}
while(x!=MAXTHRE)
{
thread[x] = CreateThread(NULL,0,fre,&Thread_Info[x],0,NULL);
x++;
}
WaitForMultipleObjects(MAXTHRE,thread,TRUE,INFINITE);
printf("finash!!\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -