本文首发于个人博客https://kezunlin.me/post/f241bd30/,欢迎阅读!

boost thread pool example

Guide

boost thread pool example with cpp code

code example

#include <iostream>    //std::cout std::endl
#include <thread> //std::thread
#include <future> //std::future std::promise
#include <utility> //std::ref
#include <chrono> //std::chrono::seconds #include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp> class ThreadPool {
public:
explicit ThreadPool(size_t size) : work_(io_service_) {
for (size_t i = 0; i < size; ++i) {
workers_.create_thread(
boost::bind(&boost::asio::io_service::run, &io_service_));
}
} ~ThreadPool() {
std::cout << "~ThreadPool" << std::endl;
io_service_.stop(); // stop before join_all
workers_.join_all();
} // Add new work item to the pool.
template<class F>
void Enqueue(F f) {
io_service_.post(f);
//sync, return immediately
} private:
boost::thread_group workers_;
boost::asio::io_service io_service_;
boost::asio::io_service::work work_;
}; boost::mutex io_mutex; void count(int id)
{
for (int i = 0; i < 10; i++)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << id << ":" << i << std::endl;
}
} void test_thread()
{
boost::thread thrd1(boost::bind(&count, 1));
boost::thread thrd2(boost::bind(&count, 2));
thrd1.join();
thrd2.join();
} void print(int i)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "print() #" << boost::this_thread::get_id() << std::endl;
std::cout << "hello " << i << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(1));
std::cout << "world " << i << std::endl;
} void test_thread_pool()
{
// Create a thread pool of 4 worker threads.
ThreadPool pool(4); // Queue a bunch of work items.
for (int i = 0; i < 8; ++i) {
pool.Enqueue(boost::bind(&print, i));
}
} void do_task(std::promise<int> &promiseObj) {
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "Inside thread: " << std::this_thread::get_id() << std::endl;
std::cout << "Inside thread: sleep 2 seconds... " << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
promiseObj.set_value(35);
} void test_future()
{
std::promise<int> promiseObj;
std::future<int> futureObj = promiseObj.get_future();
std::cout << "create thread..." << std::endl;
std::thread th(do_task, std::ref(promiseObj)); std::cout << "futureObj.get() block main thread." << std::endl;
std::cout << futureObj.get() << std::endl; th.join();
std::cout << "after join" << std::endl;
} /*
std::bind
bind预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的;[使用std::ref()可以pass by reference]
对于不事先绑定的参数,需要传std::placeholders进去,从_1开始,依次递增。placeholder是pass-by-reference的;
*/ int main(int argc, char* argv[])
{
//test_thread();
//test_thread_pool();
test_future();
return 0;
}

Reference

History

  • 20180523: created.

Copyright

使用boost实现线程池thread pool | boost thread pool example的更多相关文章

  1. boost的线程池和内存池 智能指针

    内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...

  2. Android 线程池系列教程(2)Thread,Runnable是基类及如何写Run方法

    Specifying the Code to Run on a Thread 上一课   下一课 1.This lesson teaches you to Define a Class that Im ...

  3. [图解tensorflow源码] 线程池模块分析 (CPU thread pool device)

  4. 搜集C++实现的线程池

    现在很多语言都内置了线程池实现,但C++中却没有.本文列举一些C++实现的线程池工具. Boost.Threadpool 项目首页:http://threadpool.sourceforge.net ...

  5. (原创)C++半同步半异步线程池2

    (原创)C++半同步半异步线程池 c++11 boost技术交流群:296561497,欢迎大家来交流技术. 线程池可以高效的处理任务,线程池中开启多个线程,等待同步队列中的任务到来,任务到来多个线程 ...

  6. 二 Java利用等待/通知机制实现一个线程池

    接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1  定义一个任务的接口 ...

  7. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  8. 线程池——JAVA并发编程指南

    TPS00-J. 用线程池实现应用在流量暴涨时优雅降级 很多程序都要解决这样一个问题——处理一系列外来的请求.Thread- Per-Message这种设计模式是最简单的并发策略了,它为每一个请求创建 ...

  9. 【MINA】OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor的事件监听线程池的选择

    mina中有两个线程池概念 1.处理监听建立连接的线程池  2.处理读写事件的线程池 本文中主要探讨读写事件的线程池的选择 这两种都经过实际项目的使用和检测,说说优缺点 早期的项目是用Unordere ...

随机推荐

  1. 闪讯 开启wifi教程

    这是我自己试了几次之后发现的,也不是什么技术活. 首先说下,我的比较是小米pro笔记本,一般笔记本都是自带wifi功能的.如果要开wifi的话,必须是用网线连接才可以,通过wifi连接网络就不能开移动 ...

  2. Log4j slf4j 配置简单介绍

    Log4j slf4j 配置简单介绍 先借鉴一篇很好的文章 为什么要使用SLF4J而不是Log4J import org.slf4j.Logger; import org.slf4j.LoggerFa ...

  3. Leetcode Tags(3)String(TODO)

    一.Easy 696 Count Binary Substrings Input: "00110011" Output: 6 Explanation: There are 6 su ...

  4. Day 3,学习的知识点

    年龄 如何判断是否未成年人 age = input('请输入你的年龄:')#input=输入age = int(age)#int=转化为整型if age < 18:    print('小妹妹你 ...

  5. django-URL之include函数(五)

    三种格式:(1)incude(module,namespace=None) from django.urls import path,include from book import urls url ...

  6. requests+lxml+xpath爬取电影天堂

    1.导入相应的包 import requests from lxml import etree 2.原始ur url="https://www.dytt8.net/html/gndy/dyz ...

  7. SpringBoot与MybatisPlus3.X整合之通用枚举(十二)

    一 通用枚举 解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 自3.1.0开始,可配置默认枚举处理类来省略扫描通用枚举配置 默认枚举配置 升级说明: 3.1.0 以下版本改变了原生默认行为 ...

  8. 设计模式C++描述----14.外观(Facade)模式

    一. 举例说明 还以我以前做的文件系统(FileSys)为例: 文件系统是一个独立的系统,它提供一套核心的文件操作. 除了文件系统,还有四个子系统,分别是杀毒子系统(KillVirus),压缩子系统( ...

  9. .net layui 批量导出

    .net开发,前台使用layui框架,后台使用WCF 废话不多,直接上代码 1>文件引用: admin.css layui.css layui.js jquery.min.js layerToo ...

  10. Sublime text3配置C++环境

    前言 传说sublime是全球最好的编辑器,可是只是编辑器啊!!!如果要运行,对于我们这些蒟蒻来说,不得不去使用DEV_C++.我们总是幻想能让sublime变成一个轻量级IDE,那该多好啊!!! 那 ...