大家好,又见面了,我是你们的朋友全栈君。
在windows中,系统提供了QueueUserWorkItem 函数实现异步调用,这个函数相当于在线程池中建立多个用户工作项目,跟普通线程机制一样,线程池也有线程的同步等机制。
【函数原型】
代码语言:javascript复制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 :工作项目需要长时间的工作,系统会据此安排更多的线程。
【示例代码】
代码语言:javascript复制#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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。