2024年6月13日发(作者:)

计算机学院 2秦向红 操作系统实验报告

实验二 创建线程

一、实验目的

1. 通过创建线程、观察正在运行的线程和终止线程的程序设计和调试操作,进一步熟悉

操作系统的线程概念,理解进程与线程之间的关系。

2. 通过阅读和分析实验程序,学习创建线程、观察线程和终止线程的程序设计方法。

二、实验内容

1. 创建线程

创建线程并因而成就一个多线程程序,是以CreateThread()作为一切行动的开始.

此函数的原型如下:

HANDLE CreateThread{

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId};

参数名称 使用目的

描述施行于该新线程的security属性.NULL表示使用缺省值.

新线程拥有自己的堆栈.0表示使用缺省大小:1MB.

新线程将开始的起始地址.这是一个函数指针.

此值将被传送到新线程函数作为参数

允许产生一个暂时挂起的线程.默认情况是立即开始执行

新线程的ID会被传回到这里

lpThreadAttributes

dwStackSize

lpStartAddress

lpParameter

dwCreationFlags

lpThreadId

如果CreateThread()成功,返回一个新创建的线程的handle。

如果CreateThread()失败,返回一个NULL。可以调用GetLastError()获知原因。

第 1 页

计算机学院 2秦向红 操作系统实验报告

2. 终止线程

线程结束代码可以依靠调用GetExitCodeThread()完成。

BOOL GetExitCodeThread{

HANDLE hThread, /*由CreateThread()传回的线程handle*/

LPDWORD lpExitCode /*指向一个DWORD,用于接受结束代码*/ };

如果成功,GetExitCodeThread()传回TRUE,否则传回FALSE.如果线程已结束,那么

线程的结束代码会被放在lpExitCode参数中带回来.如果线程尚未结束,lpExitCode带

回来的值是STILL_ACTIVE。

如果需要用更强制性的手法结束一个线程,可以使用ExitThread()。

三、 实验步骤

(1)开启五个线程,设计一个基于Win32多线程应用程序。

(2)基于Win32多线程应用程序,启动两个线程,当用户按下任意键时,试图退出。

(3)验证Thread 使用自己的 Stack 存放 function 中的 local variable。

四.程序设计

(1)声明线程标准函数形式,创建等待对象的句柄hThrd,创建接收 新线程ID的

DWORD变量。进行for循环,执行线程内容ThreadFunc并返回每个核心对象hThrd。之后

等待线程全部完成,结束程序。

(2)声明线程标准函数形式,创建等待对象的句柄hThrd1、hThrd2,创建获取线程

退出代码的exitCode1、exitCode2,创建接收新线程ID的DWORD变量。执行线程内容

ThreadFunc并返回每个核心对象hThrd并输出相关提示信息。进行for循环,接收用户

按下的任意键信息,调用GetExitCodeThread等待一个线程的结束,使用

GetExitCodeThread传回线程函数ThreadFunc的返回值。函数中用一个死循环,保证两

个线程能够完整的运行完成,getch()函数接收用户输入,尝试打断线程,但后面代码

保护了线程的继续执行,直至两个线程都执行完成,输出各自的返回值并退出。

(3)验证性程序。

第 2 页