Win32 API对多线程编程的支持
Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行讲解。
(1)HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId)
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。其中各参数说明如下。
lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了被创建的线程句柄由当前活动进程的子进程所继承。如果lpThreadAttributes被置为NULL,则表示不能被其子进程所继承。
lpStartAddress:指向在应用程序中定义的类型为LPTHREAD_START_ROUTINE的函数的指针,lpStartAddress表示新线程开始执行时代码所在函数的地址。
lpParameter:传递给线程的一个32位的参数。
dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,初始化CPU,登记CONTEXT结构的成员,使该线程处于就绪状态,并不马上执行,而是挂起该线程,直至函数 ResumeThread被调用。
lpThreadId:该参数指定了所创建线程的ID。对于Win95/98,该参数是必需的,不能为NULL。
(2)DWORD SuspendThread (HANDLE hThread);
该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止(指用户为其指定代码)。
每个线程都有一个挂起状态记数值,其最大值为一个常数MAXIMUM_SUSPEND_COUNT。当该计数值大于零时,线程处于挂起状态。当该计数值为零时,线程处于正常执行的状态,并且可能被调度程序装入CPU中运行。调用SuspendThread (hThread)导致由hThread标识的线程的挂起状态计数值加1。当其已经达到了最大值,再试图挂起该线程将导致调用错误。参数hThread表示将被挂起线程的句柄。
如果该函数执行成功,则函数返回调用前的线程挂起状态计数值,否则返回值被置为0xFFFFFFFF。另外,在创建线程时,使用CREATE_SUSPENDED标志也可以挂起线程。
(3)DWORD ResumeThread (HANDLE hThread);
将由hThread标识的线程的挂起状态计数值减1。
如果该函数执行成功,则返回由hThread句柄所标识的线程在调用前所拥有的挂起状态计数值。如果失败,则返回0xFFFFFFFF。
(4)VOID ExitThread ( DWORD dwExitCode );
该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。它将线程退出码设置为dwExitCode后,终止该线程(执行函数)的执行。值得注意的是,调用ExitThread后,并不能确保从系统中清除指定的线程对象。只有当该线程对象的最后一个句柄被关闭后,线程对象才被彻底清除。
(5)BOOL TerminateThread (HANDLE hThread, DWORD dwExitCode)
一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的运行。各参数含义如下:
hThread:将被终结的线程的句柄。
dwExitCode:用于指定线程的退出码。
如果函数执行成功,则返回非0值,否则返回0值。
使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源,例如为线程初始分配的堆栈等。另外,与ExitThread()函数类似,调用该函数也不能保证将hThread所指定的线程对象从系统中清除。只有当该线程对象的最后一个句柄被关闭后,该线程才会被彻底删除。

浙公网安备 33010602011771号