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");
}


发布评论