创建一个线程池,每有一个连接对象就将它添加到工作队列中,线程池中的线程通过竞争来取得任务并执行它(它是通过信号量实现的)。

//filename threadpool.h
#ifndef THREADPOOL_H
#define THREADPOOL_H #include <list>
#include <cstdio>
#include <exception>
#include <pthread.h> #include <locker.h> template <typename T>
class threadpool{
private:
int m_thread_number; //线程池中的线程数
int m_max_requests; //请求队列中允许的最大请求数
pthread_t *m_threads; //描述线程池的数组
std::list<T*> m_workqueue; //请求队列
locker m_queuelocker;
sem m_queuestat; //信号量,是否有请求需要处理
bool m_stop; //是否结束线程
public:
threadpool(int thread_number=8;int max_requests=10000);
~threadpool();
bool append(T* request); //往请求队列中添加请求
static void * worker(void *arg); //工作线程运行的函数
void run();
}; template<typename T>
threadpool<T>::threadpool(int thread_number,int max_requests):m_thread_number(thread_number),
m_max_requests(max_requests),m_stop(false),m_threads(NULL){
if((thread_number<=0)||(max_requests<=0)){
throw std::exception();
} m_threads=new pthread_t[m_thread_number];
if(!m_threads){
throw std::exception();
} //创建线程,并将他们都设为分离线程,这样线程结束时就能自动释放资源
for(int i=0;i<m_thread_number;++i){
printf("create the %dth thread\n",i);
if(pthread_create(m_threads+i,NULL,worker,this)!=0){
delete [] m_threads;
throw std::exception();
} if(pthread_detach(m_threads[i])){
delete [] m_threads;
throw std::exception();
}
}
} template<typename T>
threadpool<T>::~threadpool(){
delete [] m_threads;
m_stop=true;
} template<typename T>
threadpool<T>::append(T *request){
m_queuelocker.lock();
if(m_workqueue.size() > m_max_requests){
m_queuelocker.unlock();
return false;
} m_workqueue.push_back(request);
m_queuelocker.unlock();
m_queuestat.post();
return true;
} template<typename T>
void * threadpool<T>::worker(void *arg){
threadpool * pool=(threadpoll *)arg;
pool->run();
return pool;
} template<typename T>
void threadpool<T>::run(){
while(!m_stop){
m_queuestat.wait();
m_queuelocker.lock();
if(m_workqueue.empty()){
m_queuestat.unlock();
continue;
} T* request =m_workqueue.front();
m_workqueue.pop_front();
m_queuelocker.unlock();
if(!request){
continue;
}
request->process();
}
}
#endif

自己动手写http服务器——线程池(一)的更多相关文章

  1. Java多线程之Executor框架和手写简易的线程池

    目录 Java多线程之一线程及其基本使用 Java多线程之二(Synchronized) Java多线程之三volatile与等待通知机制示例 线程池 什么是线程池 线程池一种线程使用模式,线程池会维 ...

  2. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  3. 自己动手写http服务器——主程序(三)

    功能:目前只支持对资源的访问. 使用的模型:多线程加epoll,与传统的一个连接请求一个线程处理不同的是,这个模型只为那些需要服务的连接请求调用线程进行处理, 整个模型的大致流程 创建一个线程持对象, ...

  4. 手写tomcat——有线程池化能力的servlet 服务

    点击查看代码 public class DiyTomcat { private int port = 8080; public static final HashMap<String, DiyS ...

  5. 自己动手写RTP服务器——关于RTP协议

    转自:http://blog.csdn.net/baby313/article/details/7353605 本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及 ...

  6. 自己动手写RTP服务器——传输所有格式的视频

    上一篇文章我们介绍了如何用一个简单的UDP socket搭建一个RTP服务器.我把这份80行的代码呈现到客户面前的时候,就有人不满意了. 还有人在参考的时候会问:“楼主你的TS格式的文件是哪里来的?应 ...

  7. 自己动手写RTP服务器——用RTP协议传输TS流

    上一篇文章我们介绍了关于RTP协议的知识,那么我们现在就自己写一个简单的传输TS流媒体的RTP服务器吧. 预备知识 关于TS流的格式:TS流封装的具体格式请参考文档ISO/IEC 13818-1.这里 ...

  8. 自己动手写http服务器——处理http连接(二)

    关于http报文格式请看这篇文章 //http_conn.h #ifndef HTTPCONNECTION_H #define HTTPCONNECTION_H #include <unistd ...

  9. 死磕 java线程系列之自己动手写一个线程池(续)

    (手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的 ...

随机推荐

  1. CSS与JS中的相对路径引用

    javascript和css文件中采用相对路径,其基准路径是完全不同的. 1.javascript引用资源(比如图片)相对路径是以宿主路径(被引用的网页比如你在首页index.php引用了某js文件, ...

  2. redhat7 邮件服务搭建

    一.先搭建DNS服务,在正向和反向区域文件分别添加以下配置 cd /var/named 目录下 ① vi abc.com.zone 正向区域文件,添加以下内容 @ MX  5 mail.test.cn ...

  3. C语言实现二叉树的基本操作

    二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...

  4. Three.js 保存camera(视角)设置到数据库,包括场景的缩放、旋转、移动等

    最近在做的项目中遇到需要保存当前的3d管道视角设置的问题,用户希望在对3d场景内的管道进行了缩放.旋转.移动之后可以将场景当前的视角状态保存在数据库中,并在下次加载时读取. 经过不断的尝试和研究,在同 ...

  5. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...

  6. java删除数组中的第n个数

    package test; import java.util.Scanner; public class Deletearr { public static void deletearr(){ Sca ...

  7. Datatbel和 string之间的相互转换

     Datatable 到 string public static string DataTableToString(DataTable dt)        {            //!@&am ...

  8. Angular 5和ASP.NET Core入门

    我希望你们都知道Angular 5已经发布了.在本文中,我们将看到如何使用Angular5TemplateCore开始使用Angular 5和ASP.NET Core. 使用Angular5Templ ...

  9. ionic基本环境的搭建

    1.下载版本大于6的Node.js https://nodejs.org/en/ 个人喜欢下载最新版本 安装成功后可以用命令行工具输入node -v和npm -v分别查看node.npm版本 2.下载 ...

  10. NodeJS 常用模块积累

    cluster&forever cluster & forever 虽然 nodejs 原生已经提供了 cluster 模块,大部分情况下可以满足我们的基本需求,但这两个模块 clus ...