Boost的thread库中目前并没有提供线程池,我在sorceforge上找了一个用boost编写的线程池。该线程池和boost结合的比较好,并且提供了多种任务执行策略,使用也非常简单。

下载地址:

http://threadpool.sourceforge.net/

使用threadpool:

这个线程池不需要编译,只要在项目中包含其头文件就可以了。

一个简单的例子:

#include <iostream>
#include "threadpool.hpp"

using namespace std;
using namespace boost::threadpool;

// Some example tasks
void first_task()
{
    cout << "first task is running\n" ;
}

void second_task()
{
    cout << "second task is running\n" ;
}

void task_with_parameter(int value)
{
    cout << "task_with_parameter(" << value << ")\n";
}

int main(int argc,char *argv[])
{
    // Create fifo thread pool container with two threads.
    pool tp(2);

// Add some tasks to the pool.
    tp.schedule(&first_task);
    tp.schedule(&second_task);
    tp.schedule(boost::bind(task_with_parameter, 4));

// Wait until all tasks are finished.
    tp.wait();

// Now all tasks are finished!    
    return(0);
}

任务返回值的获取:

一般异步调用中,返回值的获取有同步获取和异步获取两种形式。

同步获取返回值:

int task_int_23()
{
    cout<<"task_int_23()\n";
    return 23;
}

future<int> res = schedule(tp, &task_int_23);
res.wait();

cout<<"get res value:"<<res.get()<<endl;

异步获取返回值:

不知道是设计者就不打算使用异步回调获取返回值还是我看的不够仔细,异步获取返回值的方式还真没有找着,只好自己简单的写了一个回调的仿函数来实现异步返回值的获取。

//R为任务函数的返回值类型
template<class R>
class callback_task
{
    typedef boost::function<void (R)> callback;
    typedef boost::function<R ()> function;

private:
    callback c_;
    function f_;

public:
    //F: 任务执行函数 C:结果回调函数
    template<class F,class C>
    callback_task(F f,C c)
    {
        f_ = f;
        c_ = c;
    }

void operator()()
    {
        c_(f_());
    }
};

通过这个对象可以很容易的实现异步结果的回调。

//task_int_23的结果回调函数
void callback(int k)
{
    cout<<"get callback value:"<<k<<endl;
}

//通过回调的形式获取任务的返回值
tp.schedule(callback_task<int>(&task_int_23,&callback));

执行效率:

这个线程池的效率还没有怎么测试过,目前还没有应用到对性能要求比较高的地方,有时间测试一下。

转载于:https://www.cnblogs.com/TianFang/archive/2007/08/23/867350.html

一个boost底下的线程池相关推荐

  1. Boost库实现线程池学习及线程实现的异步调用

    A.Boost线程池实现 参考自: Boost库实现线程池实例 原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行:使用队列存储待 ...

  2. Windows下一个比较完美的线程池实现

    1.  前言 线程池不是一个新鲜的东西,网上能找到很多原理.实现,甚至很多库都提供了实现,比如微软的 ATL::CThreadPool, Vista后提供的CreateThreadpoolWork, ...

  3. 使用VC实现一个“智能”自增减线程池

    工作中接手了一款产品的改造.因为该产品可能使用很多线程,所以产品中使用了线程池.(转载请指明来自BreakSoftware的CSDN博客) 线程池的一个优点是降低线程创建和销毁的频率:缺点是可能在比较 ...

  4. 一个Linux下C线程池的实现

    什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽 视,这时也是线程池该出场的机会了.如果线程创建和销毁时间相比 ...

  5. 一个简单的linux线程池

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

  6. 一个Linux下C线程池的实现(转)

    1.线程池基本原理 在传统服务器结构中, 常是 有一个总的 监听线程监听有没有新的用户连接服务器, 每当有一个新的 用户进入, 服务器就开启一个新的线程用户处理这 个用户的数据包.这个线程只服务于这个 ...

  7. 一个C实现的线程池(产品暂未运用)

    https://github.com/Pithikos/C-Thread-Pool

  8. linux下boost的一个扩展线程池-threadpool-的学习

    转自:http://www.cnblogs.com/xiaouisme/archive/2012/10/04/2711691.html 安装boost: http://www.boost.org/下载 ...

  9. 程序随笔——C++实现的一个线程池

    1.线程池简介 我们知道在线程池是一种多线程处理形式,处理过程中我们将相应的任务提交给线程池,线程池会分配对应的工作线程执行任务或存放在任务队列中,等待执行. 面向对象编程中,创建和销毁对象是需要消耗 ...

最新文章

  1. R语言names函数获取或者设置数据对象名称实战
  2. Linux流量监控工具 - iftop用法
  3. ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图
  4. SVN使用CVS使用
  5. Hadoop点滴-HDFS命令行接口
  6. python3-numpy数组创建的几种方法
  7. Consul在.Net Core中初体验
  8. python及环境安装_一、什么是python及开发环境安装
  9. 如何手动释放linux内存的方法,centos手动释放内存的方法
  10. 1000入门测试题目
  11. PCIe协议学习笔记
  12. 用数据分析教你如何追男神
  13. 软件工程第五次作业-项目选题
  14. 淘宝/天猫API:item_recommend-获取推荐商品列表
  15. 抖音小视频、千图网图片等多平台的微航去水印微信小程序工具解析
  16. 1310327-18-4,Cbz-N-amido-PEG3-acid受保护的胺可以在酸性条件下脱保护
  17. Java实现信用卡校验
  18. 恶意融资与上市公司的股权结构研究
  19. 小汇总|想学机器学习吗?带坑的那种
  20. IOT数字世界价值论(下)

热门文章

  1. [大学回忆录]桂X大学大二(上)学期总结
  2. vue如何取消下拉框按回车自动下拉_如何用大白菜重装系统|大白菜怎么重装系统教程详解...
  3. 【kafka】如何修改分区的指定副本为Leader|设计方案
  4. 【Elasticsearch】运行 400 多个节点的 Elasticsearch 集群
  5. 【FLink】cannot assign instance LinkedMap FlinkKafkaConsumerBase.pendingOffsetsToCommit
  6. 【MySQL】MySQL Shell 简介与使用
  7. Spring-Jpa : @MappedSuperclass的作用
  8. Docker : Docker使用DockerFile入门案例
  9. 95-235-050-源码-task-Flink task之间的数据交换
  10. Spring : ImportBeanDefinitionRegistrar动态注入