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. 第一个androidAPP项目总结—ListView的上拉和下拉

    1.下拉刷新 需继承implements SwipeRefreshLayout.OnRefreshListener @Overridepublic void onRefresh() { new Wea ...

  2. office - 连接字符串.

    Microsoft ACE OLEDB 12.0 Connect to Excel 2007 (and later) files with the Xlsx file extension. That ...

  3. Linux samba服务器设置简单匿名共享

    linux下面的samba非常的好用,很多人拿它来作共享文件服务器, 缺省配置下,samba必须提供用户名密码来访问,如果是所有人都可以访问的内容,那么是比较麻烦的,其实通过一个设置,即可实现不用输入 ...

  4. Centos 5.2安装配置DNS服务器

    BIND安装配置(主从)我的系统环境:centos 5.2 作者:哈密瓜 主:我采用的是yum安装[root@linux src]#yum -y install bind* 生成rndc控制命令的ke ...

  5. oracle单行函数之通用函数

    NVL (a,b) --当a=null时,返回b,否则返回a NVL2 (a, b, c) -- 当a=null时,返回c,否则返回b NULLIF (expr1, expr2) --当a=b时,返回 ...

  6. 电机KV值对应的桨

    KV2200 -6寸 KV1400 -8寸 KV1000 -10寸

  7. MyEclipse导入Maven项目报错 Plugin execution not covered by lifecycle configuration:

    web项目使用到mybatis,需要使用mybatis的自动生成代码插件,配置build部分如下: <build> <pluginManagement></pluginM ...

  8. Android导入项目时出现红色感叹号

    导入一个新的项目后,丢失android.jar文件 解决方法:在项目名称上单击右键,选择Properties,再选择Android,再在其中选择一个project build target,点击确定之 ...

  9. mysql命中索引规律

    就算where条件里写了and两个条件,然后建了2个独立索引,1个组合索引,他具体命中哪个是不确定的,他会根据数据分布情况选择. 比如 possible_keys    :f1,f2,f1f2,有三种 ...

  10. linux笔记2.19

    压缩一般使用 tar -cvzf etcbackup.tar.gz  /etc 寻找文件 locate(快速查找:新添加的得用updatedb更新后才能找到) find:   find . -name ...