创建一个线程使用如下API
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
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx
为了安全防护, 不可能通过一个线程ID(lpThreadId)而获得线程句柄
最终调用完了,需要调用CloseHandle 释放句柄
BOOL WINAPI CloseHandle(
_In_ HANDLE hObject
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
获取线程是否已经结束,可以调取下面的API 获知
BOOL WINAPI GetExitCodeThread(
_In_ HANDLE hThread,
_Out_ LPDWORD lpExitCode
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms683190(VS.85).aspx
强制退出线程
VOID WINAPI ExitThread(
_In_ DWORD dwExitCode
);
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
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx
为了安全防护, 不可能通过一个线程ID(lpThreadId)而获得线程句柄
最终调用完了,需要调用CloseHandle 释放句柄
BOOL WINAPI CloseHandle(
_In_ HANDLE hObject
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
获取线程是否已经结束,可以调取下面的API 获知
BOOL WINAPI GetExitCodeThread(
_In_ HANDLE hThread,
_Out_ LPDWORD lpExitCode
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms683190(VS.85).aspx
强制退出线程
VOID WINAPI ExitThread(
_In_ DWORD dwExitCode
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682659(v=vs.85).aspx
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadFunc(LPVOID);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;
DWORD dwThreadId1 = 0;
DWORD dwThreadId2 = 0;
DWORD dwExitCode1 = 0;
DWORD dwExitCode2 = 0;
hThread1 = CreateThread(0,0,ThreadFunc,(LPVOID)1,0,&dwThreadId1);
if (hThread1)
{
cout<<"Thread1 started"<<endl;
}
hThread2 = CreateThread(0,0,ThreadFunc,(LPVOID)2,0,&dwThreadId2);
if (hThread2)
{
cout<<"Thread2 started"<<endl;
}
for (;;)
{
cout<<"Press any key to exit"<<endl;
getchar();
GetExitCodeThread(hThread1,&dwExitCode1);
GetExitCodeThread(hThread2,&dwExitCode2);
if (dwExitCode1 == STILL_ACTIVE)
{
cout<<"Thread1 is working"<<endl;
}
if (dwExitCode2 == STILL_ACTIVE)
{
cout<<"Thread2 is working"<<endl;
}
if (dwExitCode1 != STILL_ACTIVE
&& dwExitCode2 != STILL_ACTIVE)
{
cout<<"All threads finished"<<endl;
break;
}
}
if (hThread1)
{
CloseHandle(hThread1);
}
if (hThread2)
{
CloseHandle(hThread2);
}
cout<<"Thread1 exit with "<<dwExitCode1<<endl;
cout<<"Thread2 exit with "<<dwExitCode2<<endl;
system("PAUSE");
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
int j = (int)n;
for (int i=0;i<10;i++)
{
Sleep(j*1000);
cout<<j<<endl;
if (j == 1 && i == 1)
{
ExitThread(4);
}
}
return 0;
}