1. 程式人生 > >C++ Boost庫 asio同步/非同步模式[ 定時器來體現 ] 筆記

C++ Boost庫 asio同步/非同步模式[ 定時器來體現 ] 筆記

此文轉自:http://blog.csdn.net/misskissC/article/details/9963515

1.機制分析

asio封裝了作業系統的selectpoll/epollkqueueoverlapped I/O眾多機制,實現了非同步I/O模式。

asio庫使用了大量的類和函式封裝了socket API,提供了一個現代風格C++網路程式設計介面,支援TCPICMPUDP等網路通訊協議。asio庫還支援串列埠讀寫、定時器SSL等功能,而且asio還是一個富有彈性的框架。

核心類

io_service,asio的任何操作都有io_service的參與,io_service

用於提交io請求並獲取作業系統對io處理後的結果。

使用asio庫程式的基本結構和流程:

  • 1.定義一個io_service物件 io_s;
  • 2.定義asio庫內具體的物件a_object[以上提到的定時器、串列埠讀寫等元件 ],並將io_service物件傳入此物件的建構函式中。
  • 3.呼叫a_object的成員函式,有的函式(如同步模式:wait(),非同步模式:async_wait())會決定io_service是在同步還是非同步模式下工作。如果呼叫非同步模式下的函式,則要將函式作為非同步模式函式的引數註冊。
  • 4.如果是採取了非同步模式,則在不想被回撥函式阻塞執行的程式碼後一定要呼叫
    io_service::run()函式,否則經註冊的回撥函式得不到執行

一個分析簡單使用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行語句會在定時器定時完畢後再輸出 ] 

此次筆記記錄完畢。