C++线程池的设计与测试

分享到:
编写了一个最基本的线程池类,处理用c_work表示的工作任务。
///////////////////////////////////////////////////////
//线程池类 
///////////////////////////////////////////////////////
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
const int DEFAULT_MAX_THREAD_NUM = 10;
const int MAX_WORK_NUM = 100000;
//c_worker类
class c_work
{
	public:
c_work():process(NULL), arg(NULL), next(NULL){}
c_work(void *(*prcss)(void *), void *arg):
process(prcss), arg(arg), next(NULL) {}
~c_work();
void *(*process)(void *);
void *arg;
unsigned char type; //最高位表示arg是否需要delete操作
c_work *next;
};
c_work::~c_work()
{
	unsigned char ifdel = type >> 7;
	if (ifdel)
	{
delete arg;
arg = NULL;
	}
}
class c_thread_pool
{
	public:
c_thread_pool();
c_thread_pool(const int max_thread_num);
~c_thread_pool();
int add_work(c_work work);
static void *thread_routine(void *arg);
pthread_mutex_t queue_lock;
pthread_cond_t queue_cond;
//	private:
c_work *queue_head;
c_work *queue_tail;
int shutdown;
pthread_t *threadid;
int max_thread_num;
int cur_queue_size;
};
c_thread_pool::c_thread_pool()
{
pthread_mutex_init(&queue_lock, NULL);
	pthread_cond_init(&queue_cond, NULL);
//工作队列初始化
	queue_head = NULL;
	queue_tail = NULL;
max_thread_num = max_thread_num;
	cur_queue_size = 0;
shutdown = 0;
max_thread_num = DEFAULT_MAX_THREAD_NUM;
	threadid = new pthread_t[max_thread_num];
	int i = 0;
for (i = 0; i < max_thread_num; i++)
	{
pthread_create(&(threadid[i]), NULL, thread_routine, (void*)this);
	}
}
c_thread_pool::c_thread_pool(int max_thread_num)
{
pthread_mutex_init(&queue_lock, NULL);
	pthread_cond_init(&queue_cond, NULL);
//工作队列初始化
	queue_head = NULL;
	queue_tail = NULL;
max_thread_num = max_thread_num;
	cur_queue_size = 0;
threadid = new pthread_t[max_thread_num];
	int i = 0;
	for (i = 0; i < max_thread_num; i++)
	{
pthread_create(&(threadid[i]), NULL, thread_routine, (void*)this);
	}
}
/*向线程池中的任务队列加入任务*/
int c_thread_pool::add_work(c_work work)
{
	c_work *newwork = new c_work;
	newwork->process = work.process;
	newwork->arg = work.arg;
	newwork->next = NULL;
pthread_mutex_lock(&queue_lock);
/*将任务加入到等待队列中*/
	if (queue_head != NULL && queue_tail != NULL)
	{
queue_tail->next = newwork;
queue_tail = newwork;
}
	else
	{
//空队列
queue_head = newwork;
queue_tail = newwork;
	}
cur_queue_size++;
	pthread_mutex_unlock(&queue_lock);
	/*等待队列中有任务了,唤醒一个等待线程,注意如果所有线程都在忙碌,这句没有任何作用*/
	pthread_cond_signal(&(queue_cond));
printf("add work returned!\n");
	return 0;
}
void* c_thread_pool::thread_routine(void *arg)
{
	c_thread_pool *pool = (c_thread_pool *)arg;
	int i = 0;
	while (1)
	{
pthread_mutex_lock(&(pool->queue_lock));
//如果等待队列为0并且不销毁线程池,则处于阻塞状态; 注意
// pthread_cond_wait是一个原子操作,等待前会解锁,唤醒后会加锁
//标注:注意这一如果任务队列不为空的话,while语句将被跳过,直接执行下面的调用。
while (pool->cur_queue_size == 0 && pool->shutdown)
{
pthread_cond_wait(&(pool->queue_cond), &(pool->queue_lock));
}
//等待队列长度减去1,并取出链表中的头元素
if (pool->cur_queue_size > 0 && pool->queue_head != NULL)
{
printf("IN THREAD ROUTINE size = %d && queue head is not NULL\n", pool->cur_queue_size);
pool->cur_queue_size--;
c_work *work = pool->queue_head;
pool->queue_head = work->next;
pthread_mutex_unlock(&(pool->queue_lock));
//调用回调函数,执行测试任务
//////////////////////////////////////////
(*(work->process))(work->arg);
free(work);
work = NULL;
}
else //不可达
{
pthread_mutex_unlock(&(pool->queue_lock));
}
	}
}
c_thread_pool::~c_thread_pool()
{
	for (int i = 0; i < max_thread_num; ++i)
pthread_cancel(threadid[i]);
	for (c_work *w_t = queue_head; w_t != NULL;)
	{
c_work *temp = w_t->next;
delete w_t;
w_t = temp;
	}
	delete [] threadid;
}
转自:http://blog.csdn.net/naturebe/article/details/7901130
昵    称:
验证码:

相关文档:

  • C/C++回调函数简要介绍
    在C/C++里面有个非常给力的库函数qsort,相信大家都用过。他的函数原型如下: void qsort(void *base,size_tnmemb,size_tsize, int(*compar)(constvoid*, con...
  • c++中string用法汇总
    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且...
  • vim c/c++智能补全插件
    我很喜欢vim,而且一直用,不过对于c/c++只能补全一直都没有一个很好的解决方案,虽然有个插件(omnicomplete)功能比较强大,跟eclipse等...
  • 用c语言实现的多平台开发库:TBOX
    TBOX是一个用c语言实现的多平台开发库,支持 windows、linux、mac、ios、android 以及其他嵌入式系统。...
  • 跨平台C++库 CrissCross
    CrissCross是一种小型的跨平台C++库,用于处理控制台和文件I / O , CPU的识别( CPUID ) ,散列( MD2 , MD4 , MD5编码,了SHA - 1 ,SHA- 256 ,S...
  • C++模板库:C++ B-tree
    这是一个C++模板库,实现了基于B-tree数据结构的有序内存容器。类似于STL的map、set、multimap和 multiset模板,C++ B-tree也提供了btree_map、btree_...
  • CMake Tools for Visual Studio
    这是一个 Visual Studio 的扩展为 CMake 语言提供了语法高亮和 IntelliSense 支持。...
  • 用于 Web 的 C++ 编译器:Duetto
    Duetto通过允许编程人员做如下的事情,来组合emscripten和node.js的优势用C++编写web应用,重用现有的代码,并且使得移植到浏览器的应用和...
  • 快速的 HTTP Header 解析C语言库:H3
    H3 是一个 C 语言实现的快速的 HTTP Header 解析库。H3使用预先建立的最小完美哈希表来定义header字段名称,以提供快速的字段名称查找。...
  • C++对象池 C++ ResourcePool
    C++ ResourcePool 是一个C++语言开发的通用的对象池,提供一个独立的类型无关的API。...
  • GCC的图形化前端 wxgcc
    wxgcc 的全称是:wxpython gcc compiling toolkit ,它是一个在Linux环境下使用的,基于 wxpython 的GCC 编译器图形前端软件,可以用来快速的编译验...
  • C++ 并发编程指南
    传播知识,介绍 C++ 并发编程。目前国内还没有一本完整介绍 C++11 并发编程的中文书籍,希望本书可以帮助广大的 C++ 开发者学习并发编...
  • 分布式C/C++编译工具 distcc
    distcc是一个分布式的C/C++编译工具,它可以组织一个网络内的多台计算机同时进行某个编译任务。下图是distcc提供的监控工具,用于查看...
  • 15款C/C++程序员必备的编译器和IDE
    当前,Web 开发人员编程语言的选择很多,比如 Java、.Net、PHP、Ruby、Perl、Python 等等。今天,本文想和大家讨论下两种古老而又广泛...
  • 很酷的C语言技巧
    C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些...
  • 浅谈C++模板机制
    模板(Template)可以看做成对于某一类问题一种通用的解决方案,而实现的具体细节则需要根据实际问题对模板做出调整和优化。...
  • Linux C 的工具包:JustKit
    JustKit 是一个简单易于使用的 Linux C 的工具包...
  • 微软开源 C++ REST SDK
    C++ REST SDK 包含在 Casablanca 项目中。 Casablanca 是一个 C++ 本地库,旨在帮助开发者的 C++ 应用程序访问云服务。如果你想编写一个响应式的...
  • MySQL进行CC++开发基础
    本文针对:CC++开发,选用MySQL作数据库,基础。...
  • C语言实现gsoap输出数据类型到XML的方法
    C语言实现gsoap输出数据类型到XML的方法...