UNIX Linux实验教程 6实验六Windows2000多进程和多线程机制_第1页
UNIX Linux实验教程 6实验六Windows2000多进程和多线程机制_第2页
UNIX Linux实验教程 6实验六Windows2000多进程和多线程机制_第3页
UNIX Linux实验教程 6实验六Windows2000多进程和多线程机制_第4页
UNIX Linux实验教程 6实验六Windows2000多进程和多线程机制_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验六 Windows2000多进程和多线程机制一. 实验目的1. 熟悉Windows2000环境下进行多进程和多线程应用程序设计的基本技术;2. 熟悉Windows2000环境下进程间和线程间同步、互斥和通信的基本方法。二. 实验指导Windows2000系统支持多进程和多线程技术。Windows 所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C+ 运行

2、库来说,这一调用发生在应用程序的main() 函数返回之后。1. 创建进程函数在Windows2000中使用函数CreateProcess()创建进程,该函数调用的核心参数是可执行文件运行时的文件名及其命令行。下表详细地列出了每个参数的类型和名称。参数名称使用目的LPCTSTR lpApplivationName全部或部分地指明包括可执行代码的EXE文件的文件名LPCTSTR lpCommandLine向可执行文件发送的参数LPSECURIITY_ATTRIBUTES lpProcessAttributes返回进程句柄的安全属性。主要指明这一句柄是否应该由其他子进程所继承LPSECURIITY

3、_ATTRIBUTES lpThreadAttributes返回进程的主线程的句柄的安全属性BOOL bInheritHandle一种标志,告诉系统允许新进程继承创建者进程的句柄DWORD dwCreationFlage特殊的创建标志 (如CREATE_SUSPENDED) 的位标记LPVOID lpEnvironment向新进程发送的一套环境变量;如为null值则发送调用者环境LPCTSTR lpCurrentDirectory新进程的启动目录STARTUPINFO lpStartupInfoSTARTUPINFO结构,包括新进程的输入和输出配置的详情LPPROCESS_INFORMATIO

4、N lpProcessInformation调用的结果块;发送新应用程序的进程和主线程的句柄和ID2. 创建线程函数在Windows中创建线程可以调用两个函数_beginthread和CreateThread两个函数。CreateThread函数的原型如下:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,/ SECURITY_ATTRIBUTES结构指针SIZE_T dwStackSize, /线程堆栈大小LPTHREAD_START_ROUTINE lpStartAddress, /线程代码起始地址LPVOID lpP

5、arameter, /传递给线程的指针DWORD dwCreationFlags, /控制线程创建的标志LPDWORD lpThreadId /接收线程标识符的变量指针);_beginthread函数的原型如下:uintptr_t _beginthread( void( _cdecl *start_address )( void * ), /线程启动代码地址 unsigned stack_size, /线程堆栈大小void *arglist /传递给线程的参数列表);3. 终止线程线程的终止有如下四种方式:(1)线程函数返回;(2)线程自身调用ExitThread 函数即终止自己,其原型为:V

6、OID ExitThread(UINT fuExitCode );它将参数fuExitCode设置为线程的退出码(3)同一进程或其他进程的线程调用TerminateThread函数,其原型为:BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);该函数用来结束由hThread参数指定的线程,并把dwExitCode设成该线程的退出码。当某个线程不再响应时,我们可以用其他线程调用该函数来终止这个不响应的线程。(4)包含线程的进程终止。4. 挂起与恢复线程当我们创建线程的时候,如果给其传入CREATE_SUSPENDED标志,则该线程创建后被挂

7、起,我们应使用ResumeThread恢复它:DWORD ResumeThread(HANDLE hThread);如果ResumeThread函数运行成功,它将返回线程的前一个暂停计数,否则返回0 x FFFFFFFF。对于没有被挂起的线程,程序员可以调用SuspendThread函数强行挂起之:DWORD SuspendThread(HANDLE hThread);一个线程可以被挂起多次。线程可以自行暂停运行,但是不能自行恢复运行。如果一个线程被挂起n次,则该线程也必须被恢复n次才可能得以执行。5. 同步与互斥windows2000/xp提供了互斥量(mutex)、信号量(semaphor

8、e)和事件(event)等三种同步对象和相应的系统调用,用于线程的互斥与同步。从本质上讲,这组同步对象的功能是相同的,他们的区别在于适用场合和效率会有所不同。互斥量主要用于共享资源的互斥访问,在一个时刻只能被一个线程使用,相关API包括CreateMutex、OpenMutex和ReleaseMutex。CreateMutex创建一个互斥对象,返回对象句柄;OpenMutex打开并返回一个已存在的互斥对象句柄,用于后续访问;而ReleaseMutex释放对互斥对象的占用,使之成为可用。信号量对象初始值的取值范围在0到最大值之间,用于限制并发访问的线程数。它的相关api包括:Createsema

9、phore、OpenSemaphore、ReleaseSemphore。Createsemaphore创建一个信号量对象,在输入参数中指定最大值和初值,返回对象句柄;OpenSemaphore返回一个已存在的信号量对象的句柄,用于后续访问;ReleaseSemphore释放对信号量对象的占用。事件对象相当于触发器,可用于通知一个或多个线程某事件的出现。它的相关API包括CreateEvent、OpenEvent、SetEvent ResetEvent和PulseEvent。CreateEvent创建一个事件对象,返回对象句柄;OpenEvent 返回一个已存在的事件对象的句柄,用于后续访问。S

10、etEvent 和PulseEvent设置制定事件对象为可用状态;ResetEvent设置指定事件对象为不可用状态。除了上述三种同步对象,windows2000/xp还提供了一些能与进程同步相关的机制。如临界区对象和互锁变量访问API等。临界区(critical section)对象只能用于在同一进程内使用的临界区,同一进程内各线程对它的访问是互斥进行的。把变量说明为CRITIACAL_SECTION类型,就可作为临界区使用。相关的API包括InitializeCriticalSection、EnterCriticalSection、TryEnterCriticalSection、LeaveC

11、riticalSection和DeleteCriticalSection。initiallizeCriticalSection对临界区对象进行初始化;EnterCriticalSection等待占用临界区的使用权,得到使用权时返回;TryEnterCriticalSection非等待方式申请临界区的使用权,申请失败时,返回0。LeaveCriticalSection释放临界区的使用权;DeleteCriticalSection释放与临界区对象相关的所有系统资源。互锁变量访问API用于对整型变量的操作,可避免线程间切换对操作连续性的影响。这组互锁变量访问API包括InterlockedExcha

12、nge、interlockedCompareExchange InterlockedExchangeAdd、InterlockedDecrement Interlockedincrement。InterlockedExchange进行32位数据的限度后写原子操作;interlockedCompareExchange 依据比较结果进行赋值的原子操作;进行限价后村结果的原子操作;InterlockedDecrement 进行先减1后村结果的原子操作;Interlockedincrement进行先加1后村结果的原子操作。三. 实验内容与步骤1. 多进程程序设计实验编写一个多进程应用程序launch.

13、c,从文件读入程序的路径,创建子进程加以执行。 1)子进程的命令行路径在文件set.txt中,其参考内容是:C:WINDOWSSYSTEM32CALC.EXEC:WINDOWSSYSTEM32NOTEPAD.EXE NEW.TXTC:WINDOWSSYSTEM32CHARMAP.EXE 2) launch.c的参考代码见附录6。 3) launch.c作为console应用程序进行编译链接和运行。编译环境为Visual C+,编译时,需要多线程支持,要设置一下VC, 步骤如下:(1点击project,选择settings,进入project settings界面(2 点击C/C+ 把categ

14、ory设置为code generation,Use run-time library设置为:Debug Multithreaded( 多线程支持)。2. 多线程程序设计实验(1)创建一个多线程应用程序Thread.c,thread线程给一个数组赋值,主线程打印数组内容,不考虑同步。thread.c参考程序见附录6。(2) 修改thread.c,用临界区对象保护对共享数组元素的访问,修改后的代码保存为threadcrit.c。threadcrit.c的参考程序如下:(3) 修改thread.c,用互斥对象保护对共享数组元素的访问,修改后的代码保存为threadmutex.c。threadmutex.c的参考程序见附录6。(3) 修改thread.c,用事件对象保护对共享数组元素的访问,修改后的代码保存为threa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论