4个线程池_vc2010线程win32线程已退出

4个线程池_vc2010线程win32线程已退出在windows中,系统提供了QueueUserWorkItem函数实现异步调用,这个函数相当于在线程池中建立多个用户工作项目,跟普通线程机制一样,线程池也有线程的同步等机制。 【函数原型】BOOLWINAPIQueueUserWorkItem(__inLPTHREAD_START_ROUTINEFunction,__inP…


Jetbrains全系列IDE稳定放心使用

在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;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190015.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 大数据建模五步法「建议收藏」

    大数据建模五步法「建议收藏」from:https://www.sohu.com/a/198093510_783844前一阵子,某网络公司发起了一个什么建模大赛,有个学员问我,数据建模怎么搞?为了满足他的好学精神,我决定写这一篇文章,来描述一下数据分析必须要掌握的技能:数据建模。本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。01第一步:选择模型或自定义模式这是建模的第一步,我们需要基于…

    2022年4月29日
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月30日
  • nvcat premium 15 激活码_在线激活

    (nvcat premium 15 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
  • 祝本站管理员孤星新婚快乐

    祝本站管理员孤星新婚快乐

    2021年7月25日
  • 中缀表达式转后缀表达式方法_后缀表达式怎么求值

    中缀表达式转后缀表达式方法_后缀表达式怎么求值前言数据结构与算法中经常遇到中缀表达式转前缀表达式的题目,网上的教程大都很不直观,自己学的时候,也走了很多弯路,现在把一个简单易懂的算法教程分享出来。中缀转后缀举个例子,一个式子:(5+20+1∗3)/14(5+20+1*3)/14(5+20+1∗3)/14如何把该式子转换成后缀表达式呢?其实就是分三步:1、按运算符优先级对所有运算符和它的运算数加括号,(原本的括号不用加)2、把运算…

    2022年10月26日
  • Java字符串转集合_java集合转数组

    Java字符串转集合_java集合转数组数组转集合方法使用Arrays.asList(数组)代码如下: //定义一个字符串 Stringzhuan=”1,2,3,4,5,6,7,8,9″; //分割字符串String[]split=zhuan.split(“,”);//把数组转成集合List<String>stringList=Arrays.asList(split);//输出结果S

    2022年9月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号