博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ASIO 多线程 线程池

Posted on 2015-10-28 17:32  bw_0927  阅读(1124)  评论(0)    收藏  举报
#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <iostream> 

void handler1(const boost::system::error_code &ec) 
{ 
  std::cout << "5 s." << std::endl; 
} 

void handler2(const boost::system::error_code &ec) 
{ 
  std::cout << "5 s." << std::endl; 
} 

boost::asio::io_service io_service; 

void run() 
{ 
  io_service.run(); 
} 

int main() 
{ 
  boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); 
  timer1.async_wait(handler1); 
  boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(5)); 
  timer2.async_wait(handler2); 
  boost::thread thread1(run); 
  boost::thread thread2(run); 
  thread1.join(); 
  thread2.join(); 
} 

多次调用同一个 I/O 服务的 run() 方法,是为基于 Boost.Asio 的应用程序增加可扩展性的推荐方法。 

 

 

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <iostream> 

void handler1(const boost::system::error_code &ec) 
{ 
  std::cout << "5 s." << std::endl; 
} 

void handler2(const boost::system::error_code &ec) 
{ 
  std::cout << "5 s." << std::endl; 
} 

boost::asio::io_service io_service1; 
boost::asio::io_service io_service2; 

void run1() 
{ 
  io_service1.run(); 
} 

void run2() 
{ 
  io_service2.run(); 
} 

int main() 
{ 
  boost::asio::deadline_timer timer1(io_service1, boost::posix_time::seconds(5)); 
  timer1.async_wait(handler1); 
  boost::asio::deadline_timer timer2(io_service2, boost::posix_time::seconds(5)); 
  timer2.async_wait(handler2); 
  boost::thread thread1(run1); 
  boost::thread thread2(run2); 
  thread1.join(); 
  thread2.join(); 
} 

另外还有一个不同的方法:不要绑定多个线程到单个 I/O 服务,而是创建多个 I/O 服务。 然后每一个 I/O 服务使用一个线程。 

 

 

==================================

在www.boost.org的boost::asio库中有一个示例程序HTTP SERVER 3.

这个服务器是使用一个io_service 和一个线程池来调用io_service::run().

在server.cpp源文件中有这样一段函数:

void server::run()
{
  // Create a pool of threads to run all of the io_services.
  std::vector<boost::shared_ptr<boost::thread> > threads;
  for (std::size_t i = 0; i < thread_pool_size_; ++i)
  {
    boost::shared_ptr<boost::thread> thread(new boost::thread(
          boost::bind(&boost::asio::io_service::run, &io_service_)));
    threads.push_back(thread);
  }

  // Wait for all threads in the pool to exit.
  for (std::size_t i = 0; i < threads.size(); ++i)
    threads[i]->join();
}

在异步信号发生时,注册的函数被触发。
触发是在调用run函数的线程内调用的。


可以把调用run的几个线程想像成几条吃包子的狗,吃完一个就会等下一个。
把async系列函数想成是包包子,
网络事件发生,就是包子包好了,扔过去,几条狗抢着吃。

 

asio是网络事件异步通知,与线程数无关,
哪怕只是一个线程,也有平台上能达到的最优事件通知。

比如用asio做一个代理服务器,只用一个线程,服务几千个用户,是没有问题的。

 

thread_pool_size_这个值只有一个作用,就是增强并发,更确切的说这里应该是增强程序处理能力的并发

这个值另外另外还有一个好处,就是可以对于多核处理器的支持;其实你可以理解成是完成端口的守候线程数;(最优化配置为2n+2)

 

只要稍微了解 Asio 的人都知道,在一个 io_service 上开几个线程后, 接下来就只要简单的使用 io_service.post() 即可投递一个闭包给线程去执行的. 这是一个天然的线程池.还可以同 io 操作复用你的线程.

停止发明垃圾的线程池实现吧