论文部分内容阅读
摘要: 多线程技术是随着多核处理器而迅速发展起来的,对线程以及多线程的内涵进行介绍,阐述线程工作的模式,并以实例的形式阐述多线程的计算机仿真。
关键词: 多线程;仿真;编程
中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0610072-01
0 引言
随着集成电路技术的发展,以处理器为核心的计算机系统越来越广泛地应用于各行各业的计算领域和实际系统中。多线程技术的研究主要源于实时系统的要求,实时系统对多任务的要求比较普遍,典型的应用是实时监控系统要求后台数据采集。多线程技术的引入,不但充分地利用了CPU的空闲时间,而且还大大提高了应用程序在输入输出方面的反应速度。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
1 线程以及多线程
1.1 进程
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。它由两个部分组成:一个是操作系统用来管理进程的内核对象;另一个是包含可执行模块或DLL模块的代码、数据以及动态分配的空间地址。每个进程可创建多个并发线程,并由一个主线程开始,这些线程共享该进程内的地址空间、数据和系统资源。
1.2 线程
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。线程基本上是轻量级的进程,它负责在单个程序里执行多任务。包含在进程中的一种实体,线程有自己的运行线索,可以完成一定的任务,可与其他线程共享进程中的共享变量及部分环境、相互之间协同来完成进程所要完成的任务。
1.3 多线程
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。
1.4 线程模型
多线程块模型(自由线程块模型),多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。
2 多线程仿真实例分析
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将介绍其中的一些重要函数。
2.1 创建线程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId)。
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:lpThreadAttributes:指向一个 SECURI
TY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;dwStackSize:指定了线程的堆栈深度,一般都设置为0;lpStartAd
dress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数名;lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;lpThreadId:该参数返回所创建线程的ID;如果创建成功则返回线程的句柄,否则返回NULL。
2.2 挂起线程
DWORD SuspendThread(HANDLE hThread)
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
2.3 重新激活线程
DWORD ResumeThread(HANDLE hThread)
该函数用于结束线程的挂起状态,执行线程。
2.4 退出线程
VOID ExitThread(DWORD dwExitCode)
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
2.5 终止线程
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。各参数含义如下:
hThread:将被终结的线程的句柄;dwExitCode:用于指定线程的退出码。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
2.6 线程间通信
BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。
idThread:将接收消息的线程的ID;Msg:指定用来发送的消息;wParam:同消息有关的字参数;lParam:同消息有关的长参数; 调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
参考文献:
[1]Olivier Hersent,David Gurle,Jean-Pierre Petit.IP Telephony Reading:Addison Weslcy,2006,192-220.
[2]刘东升、李艳军、刘兆辉、宋发兴,多线程在分布式飞行保障训练仿真系统中的应用。科技创新导报,2008年第31期.
[3]侯捷译,Win32多线程程序设计。华中科技大学出版社,2002.
关键词: 多线程;仿真;编程
中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0610072-01
0 引言
随着集成电路技术的发展,以处理器为核心的计算机系统越来越广泛地应用于各行各业的计算领域和实际系统中。多线程技术的研究主要源于实时系统的要求,实时系统对多任务的要求比较普遍,典型的应用是实时监控系统要求后台数据采集。多线程技术的引入,不但充分地利用了CPU的空闲时间,而且还大大提高了应用程序在输入输出方面的反应速度。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。
1 线程以及多线程
1.1 进程
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。它由两个部分组成:一个是操作系统用来管理进程的内核对象;另一个是包含可执行模块或DLL模块的代码、数据以及动态分配的空间地址。每个进程可创建多个并发线程,并由一个主线程开始,这些线程共享该进程内的地址空间、数据和系统资源。
1.2 线程
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。线程基本上是轻量级的进程,它负责在单个程序里执行多任务。包含在进程中的一种实体,线程有自己的运行线索,可以完成一定的任务,可与其他线程共享进程中的共享变量及部分环境、相互之间协同来完成进程所要完成的任务。
1.3 多线程
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。
1.4 线程模型
多线程块模型(自由线程块模型),多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。
2 多线程仿真实例分析
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将介绍其中的一些重要函数。
2.1 创建线程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId)。
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:lpThreadAttributes:指向一个 SECURI
TY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;dwStackSize:指定了线程的堆栈深度,一般都设置为0;lpStartAd
dress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数名;lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;lpThreadId:该参数返回所创建线程的ID;如果创建成功则返回线程的句柄,否则返回NULL。
2.2 挂起线程
DWORD SuspendThread(HANDLE hThread)
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
2.3 重新激活线程
DWORD ResumeThread(HANDLE hThread)
该函数用于结束线程的挂起状态,执行线程。
2.4 退出线程
VOID ExitThread(DWORD dwExitCode)
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。
2.5 终止线程
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。各参数含义如下:
hThread:将被终结的线程的句柄;dwExitCode:用于指定线程的退出码。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。
2.6 线程间通信
BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);
该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。
idThread:将接收消息的线程的ID;Msg:指定用来发送的消息;wParam:同消息有关的字参数;lParam:同消息有关的长参数; 调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。
参考文献:
[1]Olivier Hersent,David Gurle,Jean-Pierre Petit.IP Telephony Reading:Addison Weslcy,2006,192-220.
[2]刘东升、李艳军、刘兆辉、宋发兴,多线程在分布式飞行保障训练仿真系统中的应用。科技创新导报,2008年第31期.
[3]侯捷译,Win32多线程程序设计。华中科技大学出版社,2002.