线程池相关头文件
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>
#include <boost/asio.hpp>
#include <future>
线程池定义
optional<boost::asio::thread_pool> thread_pool;
线程池大小初始化
thread_pool.emplace( conf.thread_pool_size );
线程池使用相关函数
函数1:
该函数将task放入线程池,并返回一个promise对象task,通过task->get_future()获得一个future对象;
template<typename F>
auto async_thread_pool( F&& f ) {
auto task = std::make_shared<std::packaged_task<decltype( f() )()>>( std::forward<F>( f ) );
boost::asio::post( *thread_pool, [task]() { (*task)(); } );
return task->get_future();
}
async_thread_pool是一个模板函数,传入函数的右值引用,并且调用std::forward实现完美转发,不对f的参数进行转换,该是左值就是左值,右值仍为右值。
类模板 std::packaged_task 包装任何可调用 (Callable) 目标(函数、 lambda 表达式、 bind 表达式或其他函数对象),使得能异步调用它。其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中。
函数2:
在析构函数中对thread_pool进行判断
if( thread_pool ) {
thread_pool->join();
thread_pool->stop();
}
join()函数的目的是将程序控制权返回主线程,为了防止线程执行过程中,程序异常中断,没有正确返回线程控制权,因此在析构函数中调用join()函数。
函数3:
使用线程池
*****************************************调用处1*******************************************
if( !self.skip_auth_check() ) {
std::weak_ptr<transaction_metadata> mtrx_wp = mtrx;
mtrx->signing_keys_future = async_thread_pool( [chain_id = this->chain_id, mtrx_wp]() {
auto mtrx = mtrx_wp.lock();
return mtrx ?
std::make_pair( chain_id, mtrx->trx.get_signature_keys( chain_id ) ) :
std::make_pair( chain_id, decltype( mtrx->trx.get_signature_keys( chain_id ) ){} );
} );
}
****************************************调用处1********************************************
return async_thread_pool( [b, prev]() {
const bool skip_validate_signee = false;
return std::make_shared<block_state>( *prev, move( b ), skip_validate_signee );
} );