【Windows原理】线程池-异步过程调用

 

以前, 我们都是使用_beginthreadex() 或 CreateThread()来创建一个线程, 如果在一

个进程中, 只创建一个两个线程的话, 这并没有什么缺点

但是, 如果在一个进程中创建CPU个数2倍以上各线程, 那么, 线程的创建,销毁和切换将耗费

大量的系统资源, 会严重降低多线程的优势

线程池的出现, 就是为了避免这种劣势的情形的.

线程池内部会自动选择创建多少个线程, 我们仅仅需要将线程的回调函数交给线程池, 线程池

会自主的选择使用哪个线程来调用我们的线程回调函数.

这样一来, 也许线程池只创建了4个线程, 但是同样也能够完成100个线程才能完成的事情.

 

// 00.线程池_异步过程调用-复习.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <windows.h>
int g_num = 0;
VOID CALLBACK WorkProc(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work)
{
	InterlockedIncrement((ULONG*)&g_num);
	printf("[Work %d] %d\n", GetThreadId(GetCurrentThread()), g_num);
	Sleep(30);
}
int _tmain(int argc, _TCHAR* argv[])
{

	// 第二种方式:创建工作项
	PTP_WORK pThreadPool = CreateThreadpoolWork(WorkProc,NULL,0);

	for (int i = 0; i < 100;i++)
	{
		// 提交一个工作项到线程池
		SubmitThreadpoolWork(pThreadPool);
	}
	Sleep(30);
	WaitForThreadpoolWorkCallbacks(pThreadPool, FALSE);
	system("pause");

	// 释放掉工作项
	CloseThreadpoolWork(pThreadPool);

	return 0;
}

 

文 / luna
LEAVE A REPLY

loading