【问题标题】:C++ boost asio multithreadC++ 提升 asio 多线程
【发布时间】: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 timer1{ioservice, std::chrono::seconds{3}};
  timer1.async_wait([](const boost::system::error_code &ec)
    { std::cout << "3 sec\n"; });

  steady_timer timer2{ioservice, std::chrono::seconds{3}};
  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是同时开始和结束的。

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

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案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 我同意——这个例子的目的是通过在人类尺度上显示处理程序进入和退出来演示并发或顺序处理程序执行。
    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多