boost asio库中同步、异步工作机制

来源:互联网 发布:知乎两性关系 编辑:程序博客网 时间:2024/05/01 14:53

本文翻译自boost::asio库的说明文档,不是完整翻译。

=========================

asio使用了设计模式中的前摄器模式(Proactor),使用io_service作为前摄器,可以处理同步和异步的I/O请求,多用于网络通信。

每个使用asio库的程序都必须有一个io_service对象,负责管理与操作系统底层的通信。为进行I/O操作,还必须有一个IO对象,如一个TCP或UDP的套接字(socket)。

1.同步操作

1.1. 应用 程序调用I/O对象,初始化连接:      

socket.connect(server_endpoint);

1.2. I/O对象将请求传递给io_service对象。     

1.3. io_service对象在操作系统底层上完成连接操作。 

1.4.操作系统将执行结果返回给io_service对象。       

1.5. io_service将可能产生的错误放入boost::system::error_code对象中,并将结果返回给I/O对象。       

1.6. 如果操作失败,I/O对象抛出boost::system::system_error异常;如果成功则执行连接操作。        

boost::system::error_code ec;socket.connect(server_endpoint, ec);

 

 

2.异步操作

2.1. Your program initiates the connect          operation by calling theI/O object:应用程序调用I/O对象,初始化连接:        

socket.async_connect(server_endpoint, your_completion_handler);

 这里your_completion_handler是以下签名的函数或函数对象,准确形式由不同的异步操作而定:        

void your_completion_handler(const boost::system::error_code& ec);

2.2.  I/O对象将请求传递给io_service对象。       

2.3.    io_service对象告知操作系统将开始一个异步的连接。连接开始。     

2.4. 操作系统将消息放置到一个队列中,等待io_service对象读取。        

2.5. 应用程序调用io_service::run()或类似的成员函数来获取结果。当调用这个函数时,如果有未完成的异步操作,会发生“阻塞”,因此一般应在初次进行异步操作时调用。

2.6. 当调用io_service::run()时,io_service对象取出了队列中的信息,将其转换为一个error_code并传递给completion handler。