首页 > 代码库 > WIndows编程之线程池的使用

WIndows编程之线程池的使用

不得不说,做C++服务器程序开发,要是不理解线程池,不懂线程池,做C++服务器端的程序就没有任何意义。特别就是上次我因为理解错了线程池而做错了一件事,而被指导人批了一顿,至今记忆犹新,所以趁着周末学了下线程池的使用,小有成绩。

 

先看一种比较简单的线程池的实现。

 1 #include <windows.h>
 2 #include <string>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 #define BEGINTHREAD(Fun,Param)  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun,Param,0,NULL);
 8 
 9 DWORD WINAPI ThreadProc(LPVOID lpParameter);
10 
11 int main()
12 {
13 
14     string words[10] = { "I am a gay.....", "I am a gay, too", "Let us do something exceting", "ah, Do you want to do it in the forest or in the bed?", "neither, I want to do it on the street. haha",
15                         "I heard you like music.", "Yeah, Just like the light music.", "For example...", "bosty music and so on", "ah, you mean that is the light music...." };
16 
17     for (int i = 0; i < 10; i++)
18     {
19         //下面的代码演示了,使用CreateThread和QueueUserWorkItem,实际效果
20         //是一样的,当然线程不多的情况下如此,如果线程很多时一定要使用QueueUserWorkItem
21         QueueUserWorkItem(ThreadProc, (PVOID)&words, WT_EXECUTELONGFUNCTION);
22 
23         //显示使用CreateThread来创建多个线程的效果
24         //BEGINTHREAD(ThreadProc, (LPVOID)&words[i]);
25     }
26 
27     while (true);
28 
29     return 0;
30 }
31 
32 //该函数可以由CreateThread的线程启动,也可以使用QueueUserWorkItem线程池中的线程启动
33 DWORD WINAPI ThreadProc(LPVOID lpParameter) {
34     while (true)
35     {
36         std::string word = *(std::string*)lpParameter;
37         std::cout << "线程[ID:" << GetCurrentThreadId() << "]说:" << word << std::endl;
38         Sleep(5 * 1000);
39     }
40     return 0;
41 }

这里我们没有使用到任何线程池的信息,就可以直接使用线程池了,因为我们使用的方法里头默认给我们创建了一个线程池,但是在实际服务器的开发中,我们必须设置线程池的大小,必须自定义线程池的属性,就必须设置线程池的信息,这时就需要我们手动调用来创建线程池。

 

运行截图:

技术分享

从这张图片里面也可以看出线程池里面执行的情况与我们自定义多线程还是有很大区别的,多线程里面的输出语句是不会被打断的,但是再看看我们的程序,连输出语句也被打断了。(具体多线程里面的输出语句为什么没有被打断,目前我也不清楚,按理是应该被打断的)

 

未完,待续。。。。

WIndows编程之线程池的使用