1.简介

使用现有线程库(pthread.h)实现一个工作线程池,工作线程使用std::list实现任务队列,使用条件变量来解决生产者消费者的竞争问题

2.类说明

  • CTask
// 抽象类,所有任务的基础类,子类重写run方法,来调用任务处理函数。
class CTask {
public:CTask(){}virtual ~CTask(){}virtual void run() = 0;
private:
};
  • CThreadNotify
//将pthread.h库里的锁和条件变量封装成方便线程库使用的接口
class CThreadNotify
{
public:CThreadNotify();~CThreadNotify();void Lock() { pthread_mutex_lock(&m_mutex); }void Unlock() { pthread_mutex_unlock(&m_mutex); }void Wait() { pthread_cond_wait(&m_cond, &m_mutex); }void Signal() { pthread_cond_signal(&m_cond); }
private:pthread_mutex_t     m_mutex;pthread_mutexattr_t m_mutexattr;pthread_cond_t      m_cond;
};
  • CWorkerThread
// 工作线程,使用std::list作为任务队列,PushTask向队列里添加任务,内部条件变量会被唤醒(CThreadNotify);
//Start会创建线程消耗队列里的任务,同时没有任务时线程会被阻塞,等待条件变量唤醒(CThreadNotify)
class CWorkerThread {
public:CWorkerThread();~CWorkerThread();static void* StartRoutine(void* arg);void Start();void Execute();void PushTask(CTask* pTask);void SetThreadIdx(uint32_t idx) { m_thread_idx = idx; }
private:uint32_t        m_thread_idx;uint32_t       m_task_cnt;pthread_t        m_thread_id;CThreadNotify   m_thread_notify;list<CTask*>  m_task_list;
};
  • CThreadPoo
//Init(uint32_t worker_size)会创建指定数量的工作线程(new CWorkerThread [m_worker_size])形成线程池,同时Init会逐一启动线程池里工作线程;
//AddTask(CTask* pTask)用于添加任务,并随机分发某一个工作线程里去执行
class CThreadPool {
public:CThreadPool();virtual ~CThreadPool();int Init(uint32_t worker_size);void AddTask(CTask* pTask);void Destory();
private:uint32_t        m_worker_size;CWorkerThread*    m_worker_list;
};

3.源码

  • 链接:TeamTalk_BlueBling/threadpool
  • 本项目主要为了学习teamtalk,尽量将每个细化模块独立出来并编写测试用例,方便移植。
  • 测试demo: tests/test_threadpool.cpp

TeamTalk 线程池详解相关推荐

  1. Java线程池详解学习:ThreadPoolExecutor

    Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...

  2. Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...

    Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...

  3. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  4. 干货 | Tomcat 连接数与线程池详解

    转载自  干货 | Tomcat 连接数与线程池详解 前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在 ...

  5. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

  6. Java中线程池详解

    一.线程池简介 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池,使用线程池可以很好的提高性能,线程池在系统启动时既创建大量空闲的线程,程序将一个任务传给线程池.线程池就会启动一条线程来 ...

  7. java线程池详解及五种线程池方法详解

    基础知识 Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThrea ...

  8. 11.定时任务定时线程池详解

    3.1 新增定时任务池 11.定时任务&定时线程池详解 ​ 当我们不用任务框架时,我们想自己写一个定时任务时,我们能想起那个工具类呢?Timer ?还有吗?不知道了,下面我们要讲下Schedu ...

  9. JAVA六大线程池详解

    1)Executor执行器 详解 线程池的最顶层接口,内部就一个execute方法yong书写线程的具体执行方式 public class testExecutor implements Execut ...

  10. java 线程与线程池详解

    并发:同一时刻,多任务交替执行,造成一种"貌似同时"的错觉.简言之,单核cpu实现的多任务就是并发. 并行:同一时刻,多任务同时执行.多核cpu可实现并行. 在创建线程时,可以使用 ...

最新文章

  1. 年度BCI奖 |THE ANNUAL BCI AWARD
  2. U盘启动盘制作方法 2种绝招轻松搞定
  3. Ubuntu20.04上安装部署Elasticsearch
  4. 中位数及带权中位数问题(转)
  5. ContentProvider简介
  6. Git学习总结(17)——大型分布式团队的代码版本管理
  7. SQL注入之错误注入_基于updatexml()
  8. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
  9. java fx能不能添加到swing中_java写个记事本
  10. C#读取 *.exe.config
  11. C语言项目大作业万历年,用C语言编写万历,详细代码.doc
  12. java做游戏前端_小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
  13. 浅谈融云即时通讯服务「日志优化」
  14. 修改ubuntu终端显示目录和计算机名称(转)
  15. luogu1600天天爱跑步
  16. 数据正态分布化 + 基于回归算法的房价预测(含python代码)
  17. (有小案例)初始Mybatis框架及使用
  18. java向文件写数据的3种方式
  19. msp430 abs函数 c语言,实现一个简单的msp430软件
  20. www.starky99.com

热门文章

  1. 工作量证明生态的现状与运行原理
  2. firebug下载及安装
  3. C# Winform SplitContainer组件创建侧边菜单
  4. 高可靠性——TSN (Time Sensitive Network 时间敏感网络) 802.1Qci 协议介绍
  5. 算术逻辑运算单元ALU的串行和并行加法器
  6. 纯C语言按键驱动,使用软件查询实现
  7. python图片表格转excel表格_Python办公自动化 | word 表格转excel
  8. 手机怎么在线拍照翻译英语?这个方法不能不知道
  9. B2C项目系统软件测试计划
  10. GhostScript 沙箱绕过命令执行漏洞