• boost asio 学习(一)io_service的基础


    原文  http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-
    started-with-boostasio/

    编译环境 boost1.59 vs2015

    /**************************************************************
    技术博客
    http://www.cnblogs.com/itdef/
     
    技术交流群
    群号码:324164944
     
    欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
    **************************************************************/
     

    A guide to getting started with boost::asio
    boost asio 学习指南

    boost::asio是一个使用现代C++方法为开发者提供异步模型的跨平台的c++网络和
    底层IO库.目前已经拥有大量用户并成为boost库的一部分

    在开始之前,我们将浏览下boost::asio综述。它包括了很多我们必须知道的基本
    信息。指南不会涉及整个boost库的复杂细节,他将指导我们学习如何在我们的程
    序中使用ASIO。

    本指南不会教授任何编程语言。读者必须熟悉C++并且熟练使用boost库,尤其是
    ASIO库。指南也不会教授网络编程。换句话说,本指南的目标是指导读者使用
    asio,但是依旧需要读者花费时间读取官方文档。

    本指南示例是在windows下编译。如果代码需要移植,可能需要做一些逻辑上的改
    变。所有代码已经压缩并上传,没有包含工程文件,仅包含源码文件。代码依赖
    BOOST库。

    1 io_service的基础
    boost::asio的核心对象就是io_service.此对象类似于库的大脑和心脏。我们使
    用一个简单的示例来熟悉它,调用run成员函数。run函数将阻塞直到所有任务完成
    并且没有任何处理器被分发,或者直到io_service被停止。
    代码示例1a

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main( int argc, char * argv[] )
    {
    	boost::asio::io_service io_service;
    
    	io_service.run();
    
    	std::cout << "Do you reckon this line displays?" << std::endl;
    
    	return 0;
    }
    

      

    以下示例创建一个work类。work类在有任务运行时通知io_service。换句话说,
    当io_service有一个任务对象与其关联,它将不会停止运行。下个示例验证这个
    说法。
    代码示例1b

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main( int argc, char * argv[] )
    {
    	boost::asio::io_service io_service;
    	boost::asio::io_service::work work( io_service );
    
    	io_service.run();
    
    	std::cout << "Do you reckon this line displays?" << std::endl;
    
    	return 0;
    }
    

      

    我们运行示例代码将得到预期的效果。我们并没有看到文本的输出并且程序没有
    退出。在我们熟悉ASIO之后再优化如何优雅退出程序。
    下个例子中,我们将简单的模拟一个循环并且呼叫io_service的poll函数。poll
    函数是用来运行io_service对象事件循环处理并执行准备好的处理器。
    示例1c

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main( int argc, char * argv[] )
    {
    	boost::asio::io_service io_service;
    
    	for( int x = 0; x < 42; ++x )
    	{
    		io_service.poll();
    		std::cout << "Counter: " << x << std::endl;
    	}
    
    	return 0;
    }
    

    运行这个示例,我们将看见42行的文本输出并且程序将退出。如果我们有一个指
    定给io_service的work对象,是否有不同?
    示例1d

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main( int argc, char * argv[] )
    {
    	boost::asio::io_service io_service;
    	boost::asio::io_service::work work( io_service );
    
    	for( int x = 0; x < 42; ++x )
    	{
    		io_service.poll();
    		std::cout << "Counter: " << x << std::endl;
    	}
    
    	return 0;
    }
    

      

    运行这个示例,我们获得之前同样的输出。因为poll函数在没有任务运行时候不
    会阻塞。poll函数简单执行当前任务组并且返回。
    选择poll函数或者run函数取决于函数的设置。这些函数带来更多的兼容性,程序
    员可以更好的调整程序。run函数将阻塞并等待任务,poll函数则不。
    如果我们想从io_service移除一个work对象。通过查看文档,没有函数提供此种
    功能。为了实现此种功能,我们必须使用work对象的智能指针。
    示例代码1e

    #include <boost/asio.hpp>
    #include <boost/shared_ptr.hpp>
    #include <iostream>
    
    int main( int argc, char * argv[] )
    {
    	boost::asio::io_service io_service;
    	boost::shared_ptr< boost::asio::io_service::work > work(
    		new boost::asio::io_service::work( io_service )
    		);
    
    	work.reset();
    
    	io_service.run();
    
    	std::cout << "Do you reckon this line displays?" << std::endl;
    
    	return 0;       
    }
    

      

    程序显示如何让从io_service移除work对象,这个功能对于我们优雅的关闭一个挂起的任务很重要。
    多线程下呼叫run函数设置执行处理器的线程池。池中等待的线程是同等优先级,io_service随机选择一个触发处理器。
    示例代码1f

    #include <boost/asio.hpp>
    #include <boost/shared_ptr.hpp>
    #include <boost/thread.hpp>
    #include <iostream>
    
    boost::asio::io_service io_service;
    
    void WorkerThread()
    {
    	std::cout << "Thread Start\n";
    	io_service.run();
    	std::cout << "Thread Finish\n";
    }
    
    int main( int argc, char * argv[] )
    {
    	boost::shared_ptr< boost::asio::io_service::work > work(
    		new boost::asio::io_service::work( io_service )
    		);
    
    	std::cout << "Press [return] to exit." << std::endl;
    
    	boost::thread_group worker_threads;
    	for( int x = 0; x < 4; ++x )
    	{
    		worker_threads.create_thread( WorkerThread );
    	}
    
    	std::cin.get();
    
    	io_service.stop();
    
    	worker_threads.join_all();
    
    	return 0;
    }
    


    示例介绍stop成员函数。stop成员函数将发信号给io_service,提示所有任务将停止。所以在当前任务结束后,不再有任务发起。示例中另一个变化就是io_service对象成为全局对象。运行程序后将有4个线程开始传输信息,并且在我们敲击回车后停止。

  • 相关阅读:
    [声明]博主退役了
    galgame(s?)
    atcoder grand contest 040 F Two Pieces
    AtCoder Grand Contest 040 E
    【AtCoder】CODE FESTIVAL 2016 qual C E-順列辞書 / Encyclopedia of Permutations
    GMOJ6282 向量
    [GMOJ6281] 串
    GMOJ 5909 跑商
    2019.10.28 GMOJ 6394 燃烧的火焰
    题解 CF1092B 【Teams Forming】
  • 原文地址:https://www.cnblogs.com/itdef/p/5271302.html
Copyright © 2020-2023  润新知