乐趣区

使用boost实现线程池thread-pool-boost-thread-pool-example

本文首发于个人博客 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

  • boost thread pool example

History

  • 20180523: created.

Copyright

  • Post author: kezunlin
  • Post link: https://kezunlin.me/post/f241bd30/
  • Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
退出移动版