读书人

[C++]_[线程池的简略实现]

发布时间: 2013-03-16 11:51:46 作者: rapoo

[C++]_[线程池的简单实现]


1.当需要下载网络文件时,无限制的new 一个新线程来下载时,必然会造成创建销毁线程时的资源消耗。还有就是处理一些网络通信时,如果无限制的开线程,势必会造成系统资源严重浪费。这时候线程池能很好的解决线程复用的问题。

2.这里花了5小时做了一个简单的线程池实现,目的是给童鞋做个参考,满足特定任务的线程池也不是非常难的技术。

3.示例程序开了一个容量是5个线程的线程池下载文件,启动了10次下载任务。还有就是多线程的调试其实挺麻烦,怪不得那么多语言Scala,Erlang实现了自己的并发模型。

4.有错误的地方请指出。

5.还有其他更完善的线程池实现,如基于boost的,http://sourceforge.net/projects/threadpool/?source=directory. 只不过我习惯于能不用第3方库代码就不用的原则,原因就是引入第3方库就是引入了依赖和潜在的很难调试的Bug.不解释。

6.使用pthread线程库和curl网络库。


文件1.2

dh_thread_pool.h,dh_thread_pool.cpp


/* * main.cpp * *  Created on: 2013-3-13 *  Author: Sai */#include <stdio.h>#include <string.h>#include <iostream>using namespace std;#include "dh_thread_pool.h"#include "dh_thread_task.h"#include "dh_download_manager.h"typedef struct DiskData{FILE* file;}DiskData;size_t WriteToDisk(void *contents, size_t size, size_t nmemb,void *userp){DiskData* dd = (DiskData*) userp;size_t number = nmemb*size;size_t writed_num = fwrite(contents,1,number,dd->file);return writed_num;}void *RunTaskFunc(void * arg){int* i = (int*) arg;cout << "thread index: " << *i << endl;DhDownloadManager* manager = new DhDownloadManager();static const char* url ="http://www.istonsoft.com/downloads/iston-video-converter.exe";DiskData dd;char path[8];memset(path,0,sizeof(path));sprintf(path,"%d.exe",*i);dd.file = fopen(path,"wb");manager->Process(url,&WriteToDisk,&dd);fclose(dd.file);return NULL;}int main(int argc, char *argv[]){setbuf(stdout, (char*) NULL);setbuf(stderr, (char*) NULL);printf("Hello, world\n");DhThreadPool *pool = new DhThreadPool(5);pool->Activate();for (int o = 0; o < 10; ++o){int *i = new int;*i = o;pool->AddAsynTask(&RunTaskFunc, i);}getchar();pool->Destroy();delete pool;return 0;}


提示:完整项目文件下载地址: http://download.csdn.net/detail/infoworld/5138920



读书人网 >C++

热点推荐