boost::asio::io_context類

//有個疑惑: 向io_context對象中提交的任務只能被順序化的執行.
//下面這個構造函數代表能夠運行多線程啊。。。。。

  /**
   * Construct with a hint about the required level of concurrency.
   *
   * @param concurrency_hint A suggestion to the implementation on how many
   * threads it should allow to run simultaneously.
   */
  BOOST_ASIO_DECL explicit io_context(int concurrency_hint);

io_context類爲異步I/O對象提供核心功能,對象包括:

  • boost::asio::ip::tcp::socket
  • boost::asio::ip::tcp::acceptor
  • boost::asio::ip::udp::socket
  • boost::asio::deadline_timer
boost::asio::io_context io_context;
...
for (;;)
{
  try
  {
    io_context.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}

使用如下函數向io_context提交任務

  • boost::asio::dispatch
  • boost::asio::post
  • boost::asio::defer
void my_task()
{
  ...
}

...

boost::asio::io_context io_context;

// Submit a function to the io_context.
boost::asio::post(io_context, my_task);

// Submit a lambda object to the io_context.
boost::asio::post(io_context,
    []()
    {
      ...
    });

// Run the io_context until it runs out of work.
// Run the io_context until it runs out of work.
// Run the io_context until it runs out of work.
io_context.run(); 

io_context.restart();
boost::asio::post(io_context, my_task);

io_context.run();

若是但願在調用run()函數後即便作完任務後也不要run()函數返回,則可以使用如下類實現

boost::asio::executor_work_guard c++

asio::io_context io_context;

asio::executor_work_guard<asio::io_context::executor_type> 
    work = asio::make_work_guard(io_context);

......

work.reset(); // Allow run() to exit. @endcode

成員函數

1. count_type run();

  • 調用 run() 函數後程序將被阻塞到任務被完成同時沒用其餘任務派遣,或者直到io_context調用 stop() 函數中止爲止
  • 多線程中能夠調用 run() 函數來開啓一個線程池,io_context能夠在線程池中執行處理程序。在池中等待的全部線程都是等效的, io_context能夠選擇其中的任何一個線程來調用處理程序。
  • 在 run() 函數正常退出後當即調用 run()run_one()poll()poll_one()函數將會當即返回,除非在調用這些函數前調用restart()函數。
  • 返回被處理的程序的數量 count_type

2. std::size_t run_for(const chrono::duration<Rep, Period>& rel_time);

  • 在必定時間內處理事件循環,阻塞到任務被完成同時沒用其餘任務派遣,或者直到io_context調用 stop() 函數中止 或 超時 爲止
  • rel_time : 表示時間段

3. std::size_t run_until(const chrono::time_point<Clock, Duration>& abs_time);

abs_time : 阻塞到哪一個時間點多線程

4. count_type run_one();

  • 最多處理一個任務, 處理完就退出 或 io_context被中止
  • 函數正常退出後當即調用 run()、 run_one()、poll() 或 poll_one() 函數將會當即返回,除非在調用這些函數前調用 restart() 函數。
    count_type : 返回 0 表示io_conutext被中止

5. std::size_t run_one_for(const chrono::duration<Rep, Period>& rel_time);

6. std::size_t run_one_until(const chrono::time_point<Clock, Duration>& abs_time);

7. count_type poll();

  • 以非阻塞方式處理任務
  • 返回處理的任務數量

8. count_type poll_one();

  • 以非阻塞方式處理任務,最多處理一個
  • 返回 0 表示io_context被終止

9. void stop();

此函數將終止io_context對象的事件處理,此函數不阻塞,而只是向io_context發出中止信號。它的run()或run_one()成員函數的全部調用都應該儘快返回。對run()、run_one()、poll()或poll_one()的後續調用將當即返回,直到調用restart()。app

10. bool stopped() const;

判斷io_context對象的事件處理是否被終止異步

11. void restart();

從新啓動io_context,爲後續調用 run() 作準備。必須在run()、run_one()、poll()或poll_one()函數的第二次或更高的調用集以前調用此函數。socket

相關文章
相關標籤/搜索