C++ Boost庫 asio同步/非同步模式[ 定時器來體現 ] 筆記
阿新 • • 發佈:2019-01-26
此文轉自:http://blog.csdn.net/misskissC/article/details/9963515
1.機制分析
asio封裝了作業系統的select、poll/epoll、kqueue、overlapped I/O眾多機制,實現了非同步I/O模式。
asio庫使用了大量的類和函式封裝了socket API,提供了一個現代風格C++網路程式設計介面,支援TCP、ICMP、UDP等網路通訊協議。asio庫還支援串列埠讀寫、定時器、SSL等功能,而且asio還是一個富有彈性的框架。
核心類
io_service,asio的任何操作都有io_service的參與,io_service
使用asio庫程式的基本結構和流程:
- 1.定義一個io_service物件 io_s;
- 2.定義asio庫內具體的物件a_object[以上提到的定時器、串列埠讀寫等元件 ],並將io_service物件傳入此物件的建構函式中。
- 3.呼叫a_object的成員函式,有的函式(如同步模式:wait(),非同步模式:async_wait())會決定io_service是在同步還是非同步模式下工作。如果呼叫非同步模式下的函式,則要將函式作為非同步模式函式的引數註冊。
-
4.如果是採取了非同步模式,則在不想被回撥函式阻塞執行的程式碼後一定要呼叫
一個分析簡單使用asio同步和非同步的例子後的圖示[ 亂 ]
asio同步/非同步機制分析圖書
2 一個簡單的非同步模式的例子
(1)vs2010 使用C++ boost庫的asio
需要首先包含以下內容[ 若果要在vs2010下使用C++其它內容,則按照對應內容需求包含 ]
//避免VC下的警告 #ifdef _MSC_VER #define _WIN32_WINNT 0X0501 #endif #define BOOST_REGEX_NO_LIB #define BOOST_DATE_TIME_SOURCE #define BOOST_SYSTEM_NO_LIB #include <boost/asio.hpp> using namespace boost::asio;
(2)程式碼
建立一個vs2010的控制檯程式,在主程式中在(1)後面追加以下程式碼
#include "stdafx.h"
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost;
using namespace boost::asio;
//函式宣告
void print( const boost::system::error_code &ec );
int _tmain(int argc, _TCHAR* argv[])
{
io_service io_s;
deadline_timer d_t( io_s, posix_time::seconds(1) );
cout << d_t.expires_at() << "\n";
d_t.async_wait( print );
cout << "\n定時繼續,我輸出";
io_s.run();
cout << "\n回撥函式和程式中的程式碼誰先執行";
getchar();
return 0;
}
//回撥函式
void print( const boost::system::error_code &ec )
{
cout << "\n定時結束";
}
此段程式碼跟使用asio步驟中描述的一樣。且看看執行結果驗證一下某些結論:
圖2 非同步模式下執行結果
- 根據程式執行結果,可以有以下結論:回撥函式會阻塞io_s.run()後面程式碼的執行。
- 第2行字串的輸出不會受到定時器的制約,在第一行輸出後第二行就輸出了[ 第一行的輸出是呼叫的定時器的一個成員函式,輸出的內容是此定時器定時的終值。如果是同步模式,則第2行語句會在定時器定時完畢後再輸出 ]
此次筆記記錄完畢。