您的位置:首页 > 编程语言 > C语言/C++

c++11,线程池之二--有等待线程池中任务完成功能的线程池

2015-11-28 19:55 501 查看
#include <deque>
#include <future>
#include <memory>
#include <functional>
#include <iostream>
#include <iostream>

class function_wrapper
{
struct impl_base {
virtual void call()=0;
virtual ~impl_base() {}
};
std::unique_ptr<impl_base> impl;
template<typename F>
struct impl_type: impl_base
{
F f;
impl_type(F&& f_): f(std::move(f_)) {}
void call() { f(); }
};
public:
template<typename F>
function_wrapper(F&& f):
impl(new impl_type<F>(std::move(f)))
{}

void call() { impl->call(); }

function_wrapper(function_wrapper&& other):
impl(std::move(other.impl))
{}

function_wrapper& operator=(function_wrapper&& other)
{
impl=std::move(other.impl);
return *this;
}

function_wrapper(const function_wrapper&)=delete;
function_wrapper(function_wrapper&)=delete;
function_wrapper& operator=(const function_wrapper&)=delete;
};

class thread_pool
{
public:
std::deque<function_wrapper> work_queue;

template<typename FunctionType>
std::future<typename std::result_of<FunctionType()>::type>
submit(FunctionType f)
{
typedef typename std::result_of<FunctionType()>::type result_type;

std::packaged_task<result_type()> task(std::move(f));
std::future<result_type> res(task.get_future());
work_queue.push_back(std::move(task));
return res;
}
public:  
    thread_pool():  
        joiner(threads)  
    {  
        done.store(false);  
        unsigned const thread_count=std::thread::hardware_concurrency();  
        try  
        {  
            for(unsigned i=0;i<thread_count;++i)  
            {  
                threads.push_back(  
                    std::thread(&thread_pool::worker_thread,this));  
            }  
        }  
        catch(...)  
        {  
            done=true;  
            throw;  
        }  
    }  
  
    ~thread_pool()  
    {  
        done=true;  
    }  
  
    template<typename FunctionType>  
    void submit(FunctionType f)  
    {  
        work_queue.push(std::function<void()>(f));  
    }  

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++11 线程 c++ 线程池