[英]C++ boost asio multithread
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同時啟動和結束。
我想知道為什么線程數必須是兩個。
謝謝您的關注!
該示例的要點是,您可以有許多調用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";
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.