实验一:线程的创建与撤销
一、实验目的
(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.创建单线程执行结果:
eatApple()函数里休眠时间中要用3减去苹果个数,这样的话,传递的参数就不能超过3,等于3的时候休眠时间为0,与上一条语句同时输出,超过3无意义?
2.创建多线程执行结果:
在主函数中必须要加入休眠语句,这样不会因为主线程的结束而使创建的线程结束。同时由于sleep函数的介入,运行顺序被更改,表示三个进程运行不相互影响。(单线程与多线程的运行顺序是相反的。)
3.撤销进程执行结果:
想知道调用ExitThread()时参数为什么为0?