文档介绍:第8章进程与线程
Win32操作系统平台提供了强大的多任务功能,其中“进程”(Process)和“线程”(Thread)是其控制多任务的两个重要概念。早期的Windows ,而Windows 95/NT实行的是抢占式多任务。
在Win 32(Windows 95/NT)中,每一个进程可以同时执行多个线程,这意味着一个程序可以同时完成多个任务。对于象通信应用程序那样的既要进行耗时的工作,又要保持对用户输入响应的应用来说,使用多线程是最佳选择。当进程使用多个线程时,需要采取适当的措施来保持线程间的同步。
进程与子进程
进程(process)是计算机操作系统中的概念。进程可以理解为:程序在给定的初始状态和内存区域中,能共行执行的一次“计算”,亦即,进程是可以和其它程序共行执行的,程序的一次执行。进程有独自的内存空间、程序代码、信息以及一堆大大小小的系统资源。另外,进程之间也有父子关系,产生进程的进程是“父进程”,被产生的进程是“子进程”,通常父进程对子进程有控制权,同时子进程也可以存取父进程的资源。
创建子进程API函数
下面介绍一个很重要的函数,即CreateProcess函数,其原型为:
BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR mandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTURINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
CreateProcess() 的功能是建立并执行child process。
其它函数
本节将介绍一些可以协助我们取得process相关信息的函数。第一组要介绍的是最重要的GetCurentProcess()GetCurrentProcessId(), 前者会返回目前正在执行的process(也就是调用者)的handle, 后者会返回调用者的id。Handle和id有什么不同呢?id只是一个数字, Win32保证不会有第二个在系统中执行的process拥有相同的id, 因此,这个数字通常用来鉴别process的身份; process handle可就重要了, 因为其他与process有关的函数都需要它来当参数。
l         HANDLE GetCurrentProcess(VOID);
l         DWORD GetCurrentProcessId(VOID);
DWORD GetPriorityClass(HANDLE hProcess);
BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);
结束process
如果某个process想停止执行, 可调用ExitProcess(), 不过我们通常不直接调用它, 而是调用C程序库中的exit(), exit()在自动执行一些清除垃圾的工作之后, 再调用ExitProcess()。
VOID ExitProcess(UNT uExitCode);
不过, 如果process A 想要迫使process B 停止执行, 可以在取得process B 的handle 之后, 调用TerminateProcess():
BOOL TerminateProcess(HANDLE hProcess, UNIT uExitCode);
进程与线程
前一节我们讨论了进程和子进程的有关概念和编程技术,实际上在Windows 操作系统环境中,Microsoft提出了线程是更具有挑战性的编程概念。在Windows 32位操作系统中,所谓多任务是指系统可以同时运行多个进程,而每个进程也可以同时执行多个线程。所谓进程就是应用程序的运行实例。一个进程又可以分为多个线程,根据线程的运行特征,我们可以把它看成是操作系统分配CPU时间的基本实体。
Win16 的协同多任务
早在16位的Windows中,应用程序具有对CPU的控制权。只有在调用了GetMessage、PeekMessage、WaitMessage或Yield后,程序才有可能把CPU控制权交给系统,系统再把控制权转交给别的应用程序。如果应用程序在长时间内无法