ASIO為Boost中的一套網路函式庫,全名為asynchronous input/output,如同他的名稱,
這個函式庫的核心是在處理各種同步或非同步的問題。
要學習這套函式庫,其實最好是先從其官方的教學開始:
http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio.html
其實寫的還蠻不錯的,再來就是可以搭配以下幾個教學:
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=2
http://en.highscore.de/cpp/boost/index.html
以下為一個最簡單的asio程序:
#include <boost/asio.hpp> #include <iostream> int main( int argc, char * argv[] ){ boost::asio::io_service io_service; io_service.run(); std::cout < < "Hello world!" << std::endl; return 0; }
以上程序還沒有關係到網路,主要就只是在展示我們的程式跟OS系統操作權之間的轉移而已
其中io_service為我們的程式跟operating system’s I/O services的接口
而io_service.run()會將系統操作權交給OS,而我們的程式會一直block在這一行,直至所有非同步的工作已經完成
關於非同步,讓我們來看加入非同步操作情形來解釋:
#include <boost/asio.hpp> #include <iostream> void handler1(const boost::system::error_code &ec) { std::cout < < "5 s." << std::endl; } void handler2(const boost::system::error_code &ec) { std::cout << "10 s." << std::endl; } int main() { boost::asio::io_service io_service; boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); timer1.async_wait(handler1); boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(10)); timer2.async_wait(handler2); io_service.run(); system("pause"); }
由以上程式可以看到,我們設置了2個callback handler給各別的timer,並且各別以非同步的方式在5秒跟10秒之後執行
要特別注意的是:第一個timer開始計時的時間點是在
boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
就開始計時了,並非從 timer1.async_wait(print) 才開始計時。
同理timer2也是
handler1跟handler2呼叫的時機點是在當 io_service.run();執行之後,
才有辦法將系統操控權交給OS讓其去呼叫handler來處理當各別timer等待完成之後該做些什麼工作
等到這些非同步的timer計時完畢之後,程式才有辦法從os中取回主動權而繼續由 io_service.run();往下執行
Leave a Reply