C++ 提升 asio 多线程

Posted

技术标签:

【中文标题】C++ 提升 asio 多线程【英文标题】:C++ boost asio multithread 【发布时间】:2015-11-19 02:15:31 【问题描述】:

http://theboostcpplibraries.com/boost.asio-scalability

我正在研究 boost.asio,它引起了我的好奇心。有源(例32.3)

#include <boost/asio/io_service.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <iostream>

using namespace boost::asio;

int main()

  io_service ioservice;

  steady_timer timer1ioservice, std::chrono::seconds3;
  timer1.async_wait([](const boost::system::error_code &ec)
     std::cout << "3 sec\n"; );

  steady_timer timer2ioservice, std::chrono::seconds3;
  timer2.async_wait([](const boost::system::error_code &ec)
     std::cout << "3 sec\n"; );

  std::thread thread1[&ioservice]() ioservice.run(); ;
//std::thread thread2[&ioservice]() ioservice.run(); ;
  thread1.join();
//thread2.join();

虽然我省略了thread2,但屏幕输出是相等的。原始示例中的线程数为 2,此源中的线程数为 1。虽然线程数是1,但是timer1和timer2是同时开始和结束的。

我想知道为什么线程数必须是两个。 谢谢您的关心!

【问题讨论】:

【参考方案1】:

该示例的重点是,您可以让多个线程调用ioservice.run() 以获得更具可扩展性的代码。对于两个线程版本,timer1timer2 处理程序可能在不同的线程中处理,因此您可以获得并行性以提高性能。

正如您所展示的那样,该示例并没有很好地显示。要查看真正的区别,请尝试将此作为两个计时器的处理程序,并比较一个和两个线程版本:

timer1.async_wait([](const boost::system_error::error_code& ec) 
    std::cout << "3 sec, pausing\n";
    sleep(4);
    std::cout << "Finished pausing\n";
);

【讨论】:

虽然这个 /works/ 它实际上是异步编程的一个坏例子;异步处理程序不应执行阻塞任务。否则你很容易饿死 IO 任务。使用队列和专门的工作人员来处理运行时间较长的任务。除此之外,解释很中肯,所以+1 @sehe 我同意——这个例子的目的是通过在人类尺度上显示处理程序进入和退出来演示并发或顺序处理程序执行。 感谢您的帮助。

以上是关于C++ 提升 asio 多线程的主要内容,如果未能解决你的问题,请参考以下文章

在给定线程上使用同步 I/O 提升 asio 多线程 tcp 服务器

多线程中boost asio中的随机EOF

提升 asio 绑定:错误的文件描述符

C++ 多线程服务器帮助

asio 多线程高性能异步服务器

多线程和Boost::Asio