Boost::asio序列1: io_context

支持異步I/O功能

Boost::asio::io_context是異步I/O的核心功能,io_context提供用戶的異步I/O對象的的核心I/O功能,包含:

(1) boost::asio::ip::tcp::socket

(2) boost::asio::ip::tcp::acceptor

(3) boost::asio::ip::upd::socket

(4) boost::asio::deadline_timer

io_context也實現爲用戶提供自定義異步服務的功能

安全性

(1) 對於不同對象,線程安全

(2) 對於共享對象,除了restart() 和 notify_fork()功能包含特定的異常外,線程安全的。當run(), run_one(), run_for(), run_until(), poll() 和 poll_one()未執行完前,調用restart()將導致未定義的行爲。當任何io_context功能以及任何關聯io_context的I/O對象的函數在另外一個線程被調用時,不能夠調用notify_fork()函數

同步和異步操作

(1) 對於同步I/O情況,對於每一個I/O操作都將隱含執行一個io_context對象

(2) 對於異步I/O情況,io_context的函數run(), run_one(), run_for(), run_until(), poll() 或 poll_one()必須在io_context執行異步操作行爲前被調用,注意,一個異步操作完成的標誌是關聯的handler被調用。handler會在任何當前執行run(), run_one(), run_for(), run_until(), poll()或 poll_one()的線程中執行

handler 的異常

如果異常由handler產生,異常允許從調用io_context的run(), run_one(), run_for(), run_until(), poll() 或 poll_one()的線程傳播,並不會影響其他線程。用戶需要處理異常。

當異常被捕獲,run(), run_one(), run_for(), run_until(), poll() 或 poll_one()會自動調用restart(),並不需要其他介入調用restart(),這樣,能夠允許線程重新加入io_context對象的線程池而不影響其他已經在線程池中的線程

例如

boost::asio::io_context io_context;
...
for (;;)
{
     try
    {
      io_context.run();
      break; // run() exited normally
    }
    catch (my_exception& e)
    {
      // Deal with exception as appropriate.
    }
 }

提交任意自定義任務

通過調用自由函數: 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.
io_context.run(); @endcode

阻止io_context退出

在一些應用場景中,io_context對象需要在無任何任務時返回,例如io_context可能運行的背景線程,並且,背景線程可能在任何異步操作提交前被執行,通過創建boost::asio::executor_work_guard<io_context::executor_type>類型對象保持run()在無任何任務時保持不退出,例如:

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

boost::asio::executor_work_guard<boost::asio::io_context::executor_type>類型的work對象的stop() 和 reset()

(1) 調用stop()關閉io_context,此時,run()函數將丟棄未完成的操作和不保證ready handlers被配發

(2) 調用reset()關閉io_context, 將保證全部操作和handler被正常地結束

boost::asio::io_context io_context;
boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
= boost::asio::make_work_guard(io_context);
...
work.reset(); // Allow run() to exit.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章