支持異步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.