EOS线程池设计

本文介绍了EOS线程池的设计,包括相关头文件引用、线程池的定义与初始化、以及线程池使用的关键函数。async_thread_pool函数用于将任务放入线程池并返回future对象,析构函数确保线程池正确关闭。在实际应用中,线程池被用于交易签名键的异步获取和区块状态的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池相关头文件

#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 );

} );

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值