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

📄 multhread.cpp

📁 这是一本操作系统辅导教材的辅助资料
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>
#include <process.h>

//设立一个全局开关,在规定时刻(所创建这些线程生命期结束的时刻)通知它们
static int runFlag = true;
//各线程所要执行的模块
unsigned _stdcall threadwork (void * ThreadNo );



//主函数main,也是本进程的主线程执行的代码
void  main(int argc, char *argv[])
{
	WORD wRunTime;   //秒
	SYSTEMTIME now;  //时间结构(时,分,秒)
	WORD stopTimeMinute, stopTimeSecond;
	unsigned  ThreadID[200];
	int iThread;

	
	//检查输入参数个数及输入参数的合法性并将参数从数字串转换成数字
	if(argc!=3)							 
	{	printf("参数个数错误!\n");
		exit(0);
	}
	if((atoi(argv[1]) <=0 )| (atoi(argv[2]) <=0) )   
	{
		printf("参数不合法!\n");
		exit(0);
	}
	iThread=atoi(argv[1]);
	wRunTime=atoi(argv[2]);


	//计算需线程生命周期(所有新线程共用)
	GetSystemTime (&now);//调用返回格林尼治时间
	if (now.wHour > 16)  //转化为北京时间
		now.wHour-=16;
	else
		now.wHour+=8;		
	stopTimeSecond= (now.wSecond + (WORD)wRunTime) % 60;
	stopTimeMinute = now.wMinute + (now.wSecond + (WORD)wRunTime)/60 ;
	
	//循环创建新线程(数量由参数中指定)
	printf("mul-thread: Suit starting at system time %d:%d:%d\n", 
		now.wHour, now.wMinute, now.wSecond);
	for (int i = 0 ;i <iThread;i++)
	{
		_beginthreadex(NULL,0,threadwork,(void *)i,0,&ThreadID[i]);
		Sleep (100);  //****主线程让出时间,使新建立的线程运行
		
	}
	
	
	//在子线程工作时不断循环,判断是否这些线程生命到期
	while (runFlag)
	{
		GetSystemTime( &now );
		if (now.wHour > 16)
		now.wHour-=16;
	    else
		now.wHour+=8;
		if ((now.wMinute >= stopTimeMinute) && (now.wSecond >= stopTimeSecond))
		{runFlag = FALSE;
		 printf("mul-thread: Suit ended at system time %d:%d:%d\n", 
		      now.wHour, now.wMinute, now.wSecond);
		}
		Sleep(1000);
	}


	//在整个process结束(本主线程结束)前留出一段时间好让各子进程完成自
	//己的工作(也便于我们从它们的结束前的输出来观察线程的同步问题)
	Sleep (500);
	
	//若不在控制台运行,则下面的语句可保留窗口便于分析结果,当然,若
	//上面sleep休眠的时间足够久则此举就不必要的;
	getchar();
	exit(0);
}




//每个新线程所执行的代码
unsigned _stdcall threadwork (void * ThreadNo )
{
	//本地变量
	const int napTime= 1000; //毫秒
	int iThreadNo = (int)ThreadNo;
	
	//提示创建的相应线程已启动
	printf("Thread %d Started\n",iThreadNo);
	
   	//以下代码段用于使线程睡眠一段时间(让出cpu供其它创建的进程动作,
	//并保证主线程能更及时获得cpu来运行以改变runflag标志)
	while (runFlag)
	{
		Sleep(napTime);
	}

	//提示创建的相应线程已经结束(执行完本函数,线程自动结束)
	printf("Thread %d Ended\n",iThreadNo);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -