C ++提升asio多线程

时间:2015-11-19 02:15:31

标签: c++ multithreading boost boost-asio

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同时开始和结束。

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

1 个答案:

答案 0 :(得分:4)

示例的要点是您可以让许多线程调用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";
});