//有個疑惑: 向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);
boost::asio::io_context io_context; ... for (;;) { try { io_context.run(); break; // run() exited normally } catch (my_exception& e) { // Deal with exception as appropriate. } }
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();
boost::asio::executor_work_guard
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
- 調用 run() 函數後程序將被阻塞到任務被完成同時沒用其餘任務派遣,或者直到
io_context
調用 stop() 函數中止爲止- 多線程中能夠調用 run() 函數來開啓一個線程池,
io_context
能夠在線程池中執行處理程序。在池中等待的全部線程都是等效的,io_context
能夠選擇其中的任何一個線程來調用處理程序。- 在 run() 函數正常退出後當即調用
run()
、run_one()
、poll()
或poll_one()
函數將會當即返回,除非在調用這些函數前調用restart()
函數。- 返回被處理的程序的數量 count_type
- 在必定時間內處理事件循環,阻塞到任務被完成同時沒用其餘任務派遣,或者直到
io_context
調用 stop() 函數中止 或 超時 爲止rel_time
: 表示時間段
abs_time
: 阻塞到哪一個時間點多線程
- 最多處理一個任務, 處理完就退出 或 io_context被中止
- 函數正常退出後當即調用 run()、 run_one()、poll() 或 poll_one() 函數將會當即返回,除非在調用這些函數前調用 restart() 函數。
count_type
: 返回 0 表示io_conutext被中止
- 以非阻塞方式處理任務
- 返回處理的任務數量
- 以非阻塞方式處理任務,最多處理一個
- 返回 0 表示io_context被終止
此函數將終止io_context對象的事件處理,此函數不阻塞,而只是向io_context發出中止信號。它的run()或run_one()成員函數的全部調用都應該儘快返回。對run()、run_one()、poll()或poll_one()的後續調用將當即返回,直到調用restart()。app
判斷io_context對象的事件處理是否被終止異步
從新啓動io_context,爲後續調用 run() 作準備。必須在run()、run_one()、poll()或poll_one()函數的第二次或更高的調用集以前調用此函數。socket