⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hm.cpp

📁 (1) 掌握基本的同步与互斥算法
💻 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 + -