在windows中,系統提供了QueueUserWorkItem 函數實現異步調用,這個函數相當於在線程池中建立多個用戶工作項目,跟普通線程機制一樣,線程池也有線程的同步等機制。
【函數原型】
BOOL WINAPI QueueUserWorkItem(
__in LPTHREAD_START_ROUTINE Function,
__in PVOID Context,
__in ULONG Flags
);
【參數解析】
Function 就是用戶定義的函數;
context 是PVOID指針,也是Function的參數;
Flags 表示一組標誌值,作用可通過查MSDN看到
WT_EXECUTEDEFAULT :工作項目放入非I/O組件得線程中。
WT_EXECUTEINIOTHREAD :工作項目放入I/O組件的線程中,這樣的線程在I/O請求沒有完成之前不會被終止運行,防止因爲線程被終止導致I/O請求丟失。
WT_EXECUTEINPERSISTENTTHREAD :放入永久線程池。
WT_EXECUTELONGFUNCTION :工作項目需要長時間的工作,系統會據此安排更多的線程。
【示例代碼】
#include <assert.h>
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
DWORD WINAPI Thread1(PVOID pContext);
DWORD WINAPI Thread2(PVOID pContext);
DWORD WINAPI Thread3(PVOID pContext);
CRITICAL_SECTION g_cs;
int main(int argc, char * argv[])
{
HANDLE hCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
InitializeCriticalSection(&g_cs);
QueueUserWorkItem(Thread1, L"I'm thread 1", WT_EXECUTEINLONGTHREAD);
QueueUserWorkItem(Thread2, L"I'm thread 2", WT_EXECUTEINLONGTHREAD);
QueueUserWorkItem(Thread3, L"I'm thread 3", WT_EXECUTEINLONGTHREAD);
WaitForSingleObject(hCompleteEvent, INFINITE);
DeleteCriticalSection(&g_cs);
CloseHandle(hCompleteEvent);
//getchar();
return 0;
}
//
DWORD WINAPI Thread1(PVOID pContext)
{
EnterCriticalSection(&g_cs);
wchar_t * wszVal = (wchar_t*)pContext;
wcout << L"wszVal:" << wszVal << endl;
LeaveCriticalSection(&g_cs);
for(int i=0; i<=50; i++)
{
EnterCriticalSection(&g_cs);
cout << "One Thread Output : " << i <<endl;
LeaveCriticalSection(&g_cs);
}
return 0;
}
//
DWORD WINAPI Thread2(PVOID pContext)
{
EnterCriticalSection(&g_cs);
wchar_t * wszVal = (wchar_t*)pContext;
wcout << L"wszVal:" << wszVal << endl;
LeaveCriticalSection(&g_cs);
for(int i=0; i<=50; i++)
{
EnterCriticalSection(&g_cs);
cout << "Two Thread Output : " << i <<endl;
LeaveCriticalSection(&g_cs);
}
return 0;
}
//
DWORD WINAPI Thread3(PVOID pContext)
{
EnterCriticalSection(&g_cs);
wchar_t * wszVal = (wchar_t*)pContext;
wcout << L"wszVal:" << wszVal << endl;
LeaveCriticalSection(&g_cs);
for(int i=0; i<=50; i++)
{
EnterCriticalSection(&g_cs);
cout << "Three Thread Output : " << i << endl;
LeaveCriticalSection(&g_cs);
}
return 0;
}