【C/C++开发】C++实现简单的线程池
C++实现简单的线程池
线程池编程简介:
在我们的服务端的程序中运用了大量关于池的概念,线程池、连接池、内存池、对象池等等。使用池的概念后可以高效利用服务器端的资源,比如没有大量的线程在系统中进行上下文的切换,一个数据库连接池,也只需要维护一定里的连接,而不是占用很多数据库连接资源。同时它们也避免了一些耗时的操作,比如创建一个线程,申请一个数据库连接,而且可能就只使用那么一次,然后就立刻释放刚申请的资源,效率很低。
在我的上一篇blog中已经实现一个线程基类了,在这里我们只需要实现一个线程池类ThreadPool和该线程池调度的工作线程类WorkThread即可,而且WorkThread是继承自Thread类的。
实现思路:
一个简单的线程池的实现思路一般如下:
- 在ThreadPool中创建多个线程(WorkThreadk对象),每个线程均处于阻塞状态,等待任务的到来
- ThreadPool提供一个提交任务的接口,如post_job(ProcCallback
func, void* data); post_job后会立即返回,不会阻塞 - ThreadPool维护一个空闲线程队列,当客户程序调用post_job()后,如果空闲队列中有空闲线程,则取出一个线程句柄,并设置任务再给出新任务通知事件即可,处理等待的线程捕捉到事件信号后便开始执行任务,执行完后将该线程句柄重新push到空闲线程队列中
- 该线程池采用回调函数方式
首先我们实现一个WorkThread类:
param_ = NULL;
}
{
cb_func_ = func;
param_ = param;
notify(); {
cb_func_(param_);
param_ = NULL;
}
ThreadPool* thr_pool_; };
该WorkThread中,有一个回调函数指针和参数,当有新任务时,会在run()中被调用,执行完后会将该线程移动到空闲线程队列,等待下一次任务的提交。
ThreadPool类定义如下:
printf("start_thread_pool: failed when create a work thread: %d\n", i);
delete pthr;
}
append_idle_thread(pthr);
}
}
{
{
WorkThread* pthr = thr_vec_[i];
pthr->join();
delete pthr;
}
thr_vec_.clear();
idle_que_.clear();
}
{
stop_thread_pool();
}
{
thr_vec_.push_back(pthread);
idle_que_.push(pthread);
}
{
idle_que_.push(idlethread);
}
WorkThread* ThreadPool::get_idle_thread()
{
WorkThread* pthr = NULL;
pthr = idle_que_.take();
}
{
assert(func != NULL);
WorkThread* pthr = get_idle_thread();
{
apr_sleep(500000);
pthr = get_idle_thread();
}
pthr->set_job(func, data);
}
//启动3 个线程
//提交任务
【C/C++开发】C++实现简单的线程池的更多相关文章
- 简单C++线程池
简单C++线程池 Java 中有一个很方便的 ThreadPoolExecutor,可以用做线程池.想找一下 C++ 的类似设施,尤其是能方便理解底层原理可上手的.网上找到的 demo,基本都是介绍的 ...
- linux网络编程之简单的线程池实现
转眼间离15年的春节越来越近了,还有两周的工作时间貌似心已经不在异乡了,期待与家人团聚的日子,当然最后两周也得坚持站好最后一班岗,另外期待的日子往往是心里不能平静的,越是想着过年,反而日子过得越慢,于 ...
- java基础:简单实现线程池
前段时间自己研究了下线程池的实现原理,通过一些源码对比,发现其实核心的东西不难,于是抽丝剥茧,决定自己实现一个简单线程池,当自已实现了出一个线程池后.发现原来那么高大上的东西也可以这么简单. 先上原理 ...
- Linux C 一个简单的线程池程序设计
最近在学习linux下的编程,刚开始接触感觉有点复杂,今天把线程里比较重要的线程池程序重新理解梳理一下. 实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任 ...
- SpringBoot开发案例之多任务并行+线程池处理
前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...
- Linux C 实现一个简单的线程池
线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如 ...
- linux网络编程-一个简单的线程池(41)
有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池 1.线程池拥有若干个线程,是线程的集合,线程池中的线程数目有严格的要求,用于执行大量的相对短 ...
- java写的简单通用线程池demo
首先声明,代码部分来自网络. 1.入口DabianTest: package com.lbh.myThreadPool; import java.util.ArrayList; import java ...
- Java一个简单的线程池实现
线程池代码 import java.util.List; import java.util.Vector; public class ThreadPool { private static ...
随机推荐
- Color Highlight 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlockr自动补全注释
不是 Color Highlighter 而是 Color Highlight 少了 er 颜色功能还是很爽的,找了好久 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlo ...
- sql server 的临时表和表变量
临时表 本地临时表 适合开销昂贵 结果集是个非常小的集合 -- Local Temporary Tables IF OBJECT_ID('tempdb.dbo.#MyOrderTotalsByYe ...
- TensorFlow(十四):谷歌图像识别网络inception-v3下载与查看结构
上代码: import tensorflow as tf import os import tarfile import requests #inception模型下载地址 inception_pre ...
- qt5.10 开发安卓之硌手的小虫子们
1.jdk 下载: 下载地址:http://www.oracle.com/technetwork/java/javase/overview/index.html windows 平台不要下载java ...
- hdfs-site.xml 基本配置参考
配置参数: 1.dfs.nameservices 说明:为namenode集群定义一个services name 默认值:null 比如设置为:ns1 2.dfs.ha.namenodes.<d ...
- (转载):nmon使用
转:http://www.cnblogs.com/mululu/p/6398483.html 博客园 首页 新随笔 联系 管理 订阅 随笔- 76 文章- 1 评论- 2 Nmon的安装及使用 ...
- Hadoop hadoop(2.9.0)---uber模式(小作业“ubertask”优化)
前言: 在有些情况下,运行于Hadoop集群上的一些mapreduce作业本身的数据量并不是很大,如果此时的任务分片很多,那么为每个map任务或者reduce任务频繁创建Container,势必会增加 ...
- 深入理解WebRTC
Web Real-Time Communication(Web实时通信,WebRTC)由一组标准.协议和JavaScript API组成,用于实现浏览器之间(端到端)的音频.视频及数据共享. WebR ...
- 控制 Python 工具箱中的许可行为
def isLicensed(self): """Allow the tool to execute, only if the ArcGIS 3D Analyst 扩展模 ...
- matlab fspecial 用法解释
Matlab 的fspecial函数用法 fspecial函数用于建立预定义的滤波算子,其语法格式为:h = fspecial(type)h = fspecial(type,para)其中type指定 ...