Win32多线程程序设计
使用API线程接口函数:
- CreateThread()
- ExitThread()
- CloseHandle()
- _beginthreadex()
- _endthreadex()
CreateThread
包含头文件windows.h
函数原型
HANDLE WINAPI CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
函数返回值:句柄,返回NULL代表线程创建失败
函数参数:
- lpThreadAttributes:安全属性指针,NULL表示使用缺省值
- dwStackSize:初始堆栈大小,0代表使用默认大小:1MB
- lpStartAddress:线程函数,是一个函数指针,可以传一个函数名
- lpParameter:线程函数的参数
- dwCreationFlags:创建选项,默认为立即执行
- lpThreadId:输出参数,表示线程标识符,新线程的ID;
获得指定线程的终止状态
函数原型:
BOOL WINAPI GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
函数参数:
- hThread:由CreateThread()传回的线程句柄
- lpExitCode:输出参数,用来接收结束代码
说明:如果线程尚未终止,lpExitCode的值为STILL_ACTIVE。
WaitForSingleObject
等待核心对象处于激发状态(线程完毕)或者超时
函数原型:
DWORD WINAPI WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
返回值:
- WAIT_ABANDONED(0x00000080L)
- WAIT_OBJECT_0(0x00000000L)
- WAIT_TIMEOUT(0x00000102L)
- WAIT_FAILED (0xFFFFFFFF)
SuspendThread
用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
函数原型:
DWORD SuspendThread(HANDLE hThread);
函数参数:
hThread:指向要挂起线程的句柄
返回值:
成功返回大于零的数,表示线程之前挂起的计数。失败返回-1,可以使用GetLastError()获得错误信息。
说明:
创建新的线程后,该线程就开始启动执行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程。
ResumeThread
线程挂起计数减1,当挂起计数为0时,结束线程的挂起状态,执行线程。
函数原型:
DWORD ResumeThread(HANDLE hThread);
函数参数:
hThread:指向要被回复的线程的句柄
返回值:请参考Suspend()函数
CloseHandle
函数原型:
BOOL CloseHandle(
HANDLE hObject // handle to object);
功能:将内核对象引用计数减1
usage count初始为2 ,线程完成后减1.suspend count 默认值为0,线程退出时受信为ture;
线程终止
自杀
- 线程函数返回(return),线程自动终止
- ExitThread或_endthreadex
- TerminateThread
ExitThread
在线程内部结束一个线程
函数原型:
VOID ExitThread(DWORD dwExitCode);
函数参数:
dwExitCode:指定此线程的退出代码
返回值:无
TerminateThread
在线程外部强制结束一个线程
函数原型:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
函数参数:
hThread:指定需要结束的线程句柄
dwExitCode:指定此线程的退出代码
返回值:成功返回TRUE(非0),失败返回FALSE(0)
下面是一个简单的多线程程序
#include<Windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
cout << "GetCurrentThread()=" << GetCurrentThread() << endl;
int n = (int)lpParameter;
while (n--)
{
cout << "this is a test" << endl;
Sleep(1000);
}
return 100;
}
int main()
{
DWORD dwThreadId;
//创建线程
HANDLE hThread=CreateThread(NULL, 0, ThreadProc, (LPVOID)5, 0, &dwThreadId);
if (hThread == NULL)
{
cout << "error whit code" << GetLastError() << endl;
exit(1);
}
SuspendThread(hThread);//线程挂起 计数加1
ResumeThread(hThread); //计数减1
//轮询线程是否退出
//DWORD exitCode = 0;
//do
//{
// GetExitCodeThread(hThread, &exitCode);
//} while (exitCode == STILL_ACTIVE); //这个函数不会阻塞,因为处于忙等待,我们应该尽可能避免
//cout << "exitCode" << exitCode << endl;
DWORD ret;
ret=WaitForSingleObject(hThread, INFINITE); //阻塞
if (ret == WAIT_FAILED)
{
cout << "error whit code" << GetLastError() << endl;
exit(1);
}
else if (ret == WAIT_OBJECT_0)
{
cout << "wait succ" << endl;
}
CloseHandle(hThread);
return 0;
}