2024年4月12日发(作者:)

1. 用Win32函数创建和终止线程

Win32函数库中提供了操作多线程的函数,包括创建线程、终止线程、建立互斥区等。在

应用程序的主线程或者其他活动线程中创建新的线程的函数如下:

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD

dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID

lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);

如果创建成功则返回线程的句柄,否则返回NULL。创建了新的线程后,该线程就开始启动

执行了。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,那么线程并

不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程,在这个过程中可

以调用下面这个函数来设置线程的优先权:

BOOL SetThreadPriority(HANDLE hThread,int nPriority);

当调用线程的函数返回后,线程自动终止。如果需要在线程的执行过程中终止则可调用函数:

VOID ExitThread(DWORD dwExitCode);

如果在线程的外面终止线程,则可调用下面的函数:

BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

但应注意: 该函数可能会引起系统不稳定,而且线程所占用的资源也不释放。因此,一般情

况下,建议不要使用该函数。

如果要终止的线程是进程内的最后一个线程,则线程被终止后相应的进程也应终止。

2. 线程的同步

在线程体内,如果该线程完全独立,与其他线程没有数据存取等资源操作上的冲突,则可按

照通常单线程的方法进行编程。但是,在多线程处理时情况常常不是这样,线程之间经常要

同时访问一些资源。由于对共享资源进行访问引起冲突是不可避免的,为了解决这种线程同

步问题,Win32 API提供了多种同步控制对象来帮助程序员解决共享资源访问冲突。在介绍

这些同步对象之前先介绍一下等待函数,因为所有控制对象的访问控制都要用到这个函数。

Win32 API提供了一组能使线程阻塞其自身执行的等待函数。这些函数在其参数中的一个或

多个同步对象产生了信号,或者超过规定的等待时间才会返回。在等待函数未返回时,线程

处于等待状态,此时线程只消耗很少的CPU时间。使用等待函数既可以保证线程的同步,

又可以提高程序的运行效率。最常用的等待函数是:

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);

线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统

内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到

内核态,只在用户态完成操作。

用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:

事件,信号量,互斥量。

下面我们来分别看一下这些方法:

原子操作(全局变量):

#include "stdafx.h"

#include "windows.h"

#include "stdio.h"

volatile int ThreadData = 1;

void ThreadProcess()

{

for(int i=0; i<6; i++)

{

Sleep(1000);

printf("Sub Thread Tick %5d!n",(i+1)*1000);

}

ThreadData = 0;

printf("Exit Sub Thread!n");

}