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同时开始和结束。
我想知道为什么线程的数量必须是两个。
谢谢你的关注!
答案 0 :(得分:4)
示例的要点是您可以让许多线程调用ioservice.run()
来获得更具伸缩性的代码。使用两个线程版本,timer1
和timer2
处理程序可能在不同的线程中处理,因此您可以获得并行性以提高性能。
如您所示,该示例并未表现得那么好。要查看真正的区别,请尝试将其作为两个计时器的处理程序,并比较一个和两个线程版本:
timer1.async_wait([](const boost::system_error::error_code& ec) {
std::cout << "3 sec, pausing\n";
sleep(4);
std::cout << "Finished pausing\n";
});