xl_blocking_queue.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#ifndef SRC_COMMON_BLOCKING_QUEUE_H_
#define SRC_COMMON_BLOCKING_QUEUE_H_
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <queue>
 
template<typename T>
class xl_blocking_queue
  :boost::noncopyable
{
public:
  xl_blocking_queue()
    :mutex_(), queue_(), cond_()
  {
   
  }
  ~xl_blocking_queue(){}
 
  void put(const T& func)
  {
    boost::unique_lock<boost::mutex> lock(mutex_);
    queue_.push(func);
    cond_.notify_all();
  }
 
  T get()
  {
    boost::unique_lock<boost::mutex> lock(mutex_);
    if (queue_.size() == 0)
    {
      cond_.wait(lock);
    }
    T front(queue_.front());
    queue_.pop();
    return front;
  }
 
  unsigned size()
  {
    return queue_.size();
  }
 
  void notify_all()
  {
    cond_.notify_all();
  }
private:
  std::queue<T> queue_;
  boost::condition_variable_any cond_;
  boost::mutex mutex_;
};
 
 
#endif

xl_thread_pool.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<strong>#ifndef SRC_COMMON_THREAD_POOL_H_
#define SRC_COMMON_THREAD_POOL_H_
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
 
#include <vector>
#include "xl_blocking_queue.h"
 
typedef boost::function<void (void)> thread_do_func;
 
class xl_thread_pool
  :boost::noncopyable
{
public:
  xl_thread_pool(int thread_num)
    :num_(thread_num), run_(false)
  {
     
  }
  ~xl_thread_pool()
  {
    if (run_)
    {
      stop();
    }
  }
 
  void start()
  {
    if (num_ <= 0) return;
    int i = 0;
    run_ = true;
    for(i=0;i<num_;i++)
    {
      boost::shared_ptr<boost::thread> thread(new boost::thread(boost::BOOST_BIND(&xl_thread_pool::run, this)));
      thread_arr_.push_back(thread);
    }
  }
 
  void stop()
  {
    run_ = false;
    queue_.notify_all();
  }
 
  void post(const thread_do_func& task)
  {
    if (thread_arr_.size() == 0)
    {
      task();
    }
    else
    {
      queue_.put(task);
    }   
  }
private:
  xl_blocking_queue<thread_do_func> queue_;
  std::vector<boost::shared_ptr<boost::thread> > thread_arr_;
  int num_;
  bool run_;
 
  void run()
  {
    while(run_)
    {
      thread_do_func task = queue_.get();
      task();
    }
  }
};
 
 
#endif

一个C++基于boost简单实现的线程池的更多相关文章

  1. 基于队列queue实现的线程池

    本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 写在前文:在Python中给多进程提供了进程池类,对于线程,Python2并没有直接提供线程池类(Python3中提供了线程池功能) ...

  2. 一个简单的python线程池框架

    初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...

  3. 一个简单的linux线程池(转-wangchenxicool)

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  4. 自定义简单版本python线程池

    python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: #用threading queue 做线程池 import queue import ...

  5. concurrent.futures模块简单介绍(线程池,进程池)

    一.基类Executor Executor类是ThreadPoolExecutor 和ProcessPoolExecutor 的基类.它为我们提供了如下方法: submit(fn, *args, ** ...

  6. Linux杂谈: 实现一种简单实用的线程池(C语言)

    基本功能 1. 实现一个线程的队列,队列中的线程启动后不再释放: 2. 没有任务执行时,线程处于pending状态,等待唤醒,不占cpu: 3. 当有任务需要执行时,从线程队列中取出一个线程执行任务: ...

  7. 简单实现java线程池

    使用多线程以及线程池的意义无需多说,要想掌握线程池,最好的方法还是自己手动去实现. 一.实现思路      (网络盗图) 二.实现代码 1.线程池类 package com.ty.thread; im ...

  8. 基于C++11实现的线程池

    1.C++11中引入了lambada表达式,很好的支持异步编程 2.C++11中引入了std::thread,可以很方便的构建线程,更方便的可移植特性 3.C++11中引入了std::mutex,可以 ...

  9. 基于Linux/C++简单线程池的实现

    我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等.C++11中的STL也 ...

随机推荐

  1. (转)用JS判断ckeditor3.6版本编辑器内容为空的方法

    因为编者我还是一个初学入门者,无论是JS还是PHP,都是懂了点皮毛.今天在研究ckeditor编辑器的时候遇到了一些问题,虽然这只是我的个人问题,但觉得可以分享给其他人,或许也有像我这样的初学者也会遇 ...

  2. Repeater的ItemDataBound 事件中e.Item.DataItem 的数据类型

    1.使用DataSet和DataTable绑定数据源时 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时 Syst ...

  3. 搭建maven项目简介

    http://jingyan.baidu.com/album/9f7e7ec0b714ae6f29155465.html?picindex=1 Maven学习 (一) 搭建Maven环境 http:/ ...

  4. 如何清理多余的Windows桌面右键菜单

    删除多余的发送到选项 Win7使用一段时间后,我们可能会装很多软件,这时候右键菜单可能会变得很长,特别是“发送到(Send to)”里面的选项,有时候我们卸载软件之后在右键发送到菜单里还会有残存的选项 ...

  5. 跟我学android-搭建Android开发环境(一)

    Android官网地址:http://developer.android.com/,下载和安装 AndroidSDK请按如下步骤进行: 下载ADT 和SDK:http://developer.andr ...

  6. CC Arithmetic Progressions (FFT + 分块处理)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出n个数,选出三个数,按下标顺序形成等差数 ...

  7. Struts2+Spring4+Hibernate4整合超详细教程

    Struts2.Spring4.Hibernate4整合 超详细教程 Struts2.Spring4.Hibernate4整合实例-下载 项目目的: 整合使用最新版本的三大框架(即Struts2.Sp ...

  8. SQL Server 中的SET XACT_ABORT各种用法及显示结果

      源地址:http://www.cnblogs.com/rob0121/articles/2320932.html 点击进入 默认行为:默认为SET XACT_ABORT OFF,没有事务行为. S ...

  9. json格式初涉

    json用{}表示json对象,[]表示数组,里面以值对的方式来存储信息 var jsondata='{"staff": [{"name":"jim& ...

  10. Mysql中的DQL查询语句

    ----------------1.查询所有列 --查询 学生 表所有记录(行) select *from 学生 --带条件的查询 select *from 学生 where 年龄>19 --- ...