boost::asio::io_service使用時的注意事項
◆boost::asio::io_service使用時的注意事項:
①請讓boost::asio::io_service和boost::asio::io_service::work搭配使用。
②想讓event按照進入(strand)時的順序被執行,需要boost::asio::io_service要和boost::asio::io_service::strand搭配使用。
③一般情況下,io_service的成員函式的使用順序:
boost::asio::io_service構造,
boost::asio::io_service::run(),
boost::asio::io_service::stop(),
boost::asio::io_service::reset(),
boost::asio::io_service::run(),
......
boost::asio::io_service析構,
④不論有沒有使用io_service::work,run()都會執行完io_service裡面的event,(若沒有用work,run就會退出)。
⑤一個新建立的io_service不需要執行reset()函式。
⑥在呼叫stop()後,在呼叫run()之前,請先呼叫reset()函式。
⑦函式stop()和reset()並不能清除掉io_service裡面尚未執行的event。
我個人認為,也只有析構掉io_service,才能清空它裡面的那些尚未執行的event了。(可以用智慧指標)。
⑧函式stop(),stopped(),reset(),很簡單,請單步除錯,以明白它在函式裡做了什麼。
⑨boost的.hpp檔案裡面(一般情況下)有各個函式的使用說明,你可以隨時檢視。
◆下面是boost::asio::io_service的stop()和reset()函式的註釋的翻譯:
void boost::asio::io_service::stop();
BOOST_ASIO_DECL void stop();
/// Stop the io_service object's event processing loop.
/// 停止io_service物件的事件處理迴圈。
/**
* This function does not block, but instead simply signals the io_service to
* stop. All invocations of its run() or run_one() member functions should
* return as soon as possible. Subsequent calls to run(), run_one(), poll()
* or poll_one() will return immediately until reset() is called.
*/
/**
這個函式不阻塞,而是僅僅表示io_service停止了。
它的run()或run_one()成員函式的呼叫應當儘快返回。
對run()、run_one()、poll()、poll_one()的隨後的呼叫將會立即返回直到reset()函式被呼叫了。
*/
void boost::asio::io_service::reset();
BOOST_ASIO_DECL void reset();
/// Reset the io_service in preparation for a subsequent run() invocation.
/// 重置io_service物件,為隨後的run()呼叫做準備。
/**
* This function must be called prior to any second or later set of
* invocations of the run(), run_one(), poll() or poll_one() functions when a
* previous invocation of these functions returned due to the io_service
* being stopped or running out of work. After a call to reset(), the
* io_service object's stopped() function will return @c false.
*
* This function must not be called while there are any unfinished calls to
* the run(), run_one(), poll() or poll_one() functions.
*/
/**
io_service被停止,或者執行完handler而缺乏工作時,run()、run_one()、poll()、poll_one()函式的呼叫會被返回。
這些函式在被呼叫之前,必須先呼叫reset函式。
在reset函式被呼叫後,io_service物件的stopped函式將會返回false。
當run()、run_one()、poll()、poll_one()函式的任何的呼叫未結束時,這個函式一定不能被呼叫。
*/
◆對stop()和reset()函式的一點說明(是我單步除錯時看到的):
在Windows下,boost::asio::io_service類裡面有一個數據成員為"stopped_"(Flag to indicate whether the event loop has been stopped.)。它是一個標誌,它標誌著事件迴圈是不是被stopped了。而boost::asio::io_service::reset()函式僅僅是賦值"stopped_=0"。boost::asio::io_service::stopped()函式僅僅是判斷"0!=stopped_"的真假。你單步除錯一下,就什麼都知道了。