操作系统实验一、线程的创建与撤销

实验一:线程的创建与撤销

一、实验目的

(1)熟悉windows系统提供的线程创建与撤销系统调用。

(2)掌握windows系统环境下线程的创建与撤销方法。

二、实验准备

线程的概念

(1)线程(thread),是操作系统能够进行运算调度的最小单位。

(2)它被包含在进程之中,是进程中的实际运作单位。

(3)线程是独立调度和分配的基本单位。

(4)一条线程指的是进程中一个单一顺序的控制流。

(5)一个进程中可以并发多个线程,每条线程并行执行不同的任务。

工具

1.创建线程

CreateThread()完成线程的创建,它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立的线程的句柄。

HANDLE CreateThread(
		LPSECURITY_ATTRIBUTES lpThreadAttributes,//为线程指定安全属性
		DWORD dwStackSize,   //线程堆栈的大小,传入0表示默认大小(1MB)
		LPSECURITY_START_ROUTINE lpStartAddress,  //指定线程要执行的函数
		LPVOID lpparameter,  //函数要传递的参数,NULL表示无参数传入
		DWORD dwCreationFlags,  //指定线程创建后所处的状态
		LPDWORD lpThreadId  //系统返回的线程标识符
		
)
2.撤销进程

ExitThread()函数,强制线程终止运行:该函数将终止线程的运行,并导致操作系统清楚该线程使用的所有操作系统资源。(ps:C++资源,如C++类对象,将不被撤销)

3.终止线程

TeminateThread()函数也能够终止线程的运行,该函数与ExitThread()的区别在于,ExitThread()在撤销线程是将该线程所拥有的资源全部归还给系统,而TerminateThread()不归还资源。(在这里不推荐使用)

4.关闭句柄

CloseHandle()用于关闭已打开的对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使线程安全运行。

三、实验内容

代码分析:

1.创建单线程:

void eatApple(int apple_number)
{
	Sleep((3-apple_number)*1000);
	printf("I'm eating apple #%d\n",apple_number);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int a=0;
	int b=1;
	int c=2;
	eatApple(a);
	eatApple(b);
	eatApple(c);
	return 0;
}

2.创建多线程:

void eatApple(int apple_number)
{
	Sleep((3-apple_number)*1000);
	printf("I'm eating apple #%d\n",apple_number);
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	
	HANDLE handle1=NULL;
	HANDLE handle2=NULL;
	HANDLE handle3=NULL;
	DWORD ThreadID1=NULL;
	DWORD ThreadID2=NULL;
	DWORD ThreadID3=NULL;
	int a=0;
	int b=1;
	int c=2;
	handle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) a,0,&ThreadID1);
	handle2=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) b,0,&ThreadID2);
	handle3=CreateThread((LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) eatApple,(LPVOID) c,0,&ThreadID3);
	Sleep(10000);
	return 0;
}

3.撤销进程:

void eatApple(int apple_number)
{
	Sleep((3-apple_number)*1000);
	printf("I'm eating apple #%d\n",apple_number);
	while(1){
		printf("#%d is exiting.\n",apple_number);
		ExitThread(0);
	}
}

四、实验结果与总结

1.创建单线程执行结果:

1

eatApple()函数里休眠时间中要用3减去苹果个数,这样的话,传递的参数就不能超过3,等于3的时候休眠时间为0,与上一条语句同时输出,超过3无意义?

2.创建多线程执行结果:

2

在主函数中必须要加入休眠语句,这样不会因为主线程的结束而使创建的线程结束。同时由于sleep函数的介入,运行顺序被更改,表示三个进程运行不相互影响。(单线程与多线程的运行顺序是相反的。)

3.撤销进程执行结果:

3

想知道调用ExitThread()时参数为什么为0?

猜你喜欢

转载自blog.csdn.net/weixin_44775375/article/details/107754834