簡體   English   中英

C ++ Boost Asio多線程

[英]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()線程來獲取更多可伸縮的代碼。 使用兩個線程版本時,有可能在不同的線程中處理timer1timer2處理程序,因此可以獲取並行性以提高性能。

正如您所演示的,該示例顯示得不好。 若要查看真正的區別,請嘗試將其用作兩個計時器的處理程序,然后比較一個和兩個線程版本:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM