• ASIO学习一:基础技巧


    //boost :boost_1_44
    	//http://www.boost.org/
    //IDE	:Microsoft Visual Studio 2008
    		// Version 9.0.30729.1 SP
    		// Microsoft .NET Framework
    		// Version 3.5 SP1
    		// Installed Edition: Enterprise
    		// Microsoft Visual Basic 2008  
    		// Microsoft Visual C++ 2008   
    		// Microsoft Visual Studio 2008 Team Explorer   
    //OS	:
    		//OS 名称:          Microsoft Windows XP Professional
    		//OS 版本:          5.1.2600 Service Pack 3 Build 2600
    		//OS 制造商:        Microsoft Corporation
    		//OS 配置:          成员工作站
    		//OS 构件类型:      Multiprocessor Free
    		//系统制造商:       Dell Inc.
    		//系统型号:         Precision WorkStation 690
    		//系统类型:         X86-based PC
    		//处理器:           安装了 2 个处理器。
    
    //date: 2012-12-19-->21
    //CONTENT
    //Basic Skills 
    //内容引用URL :http://think-async.com/Asio/boost_asio_1_5_3/doc/html/boost_asio/tutorial.html
    
    //Using a timer synchronously
    #include "iostream"
    #include "boost/asio.hpp"
    #include "boost/date_time/posix_time/posix_time.hpp"
    void class1_Timer()
    {
    	//1.	all programs that use asio need to have
    	//			at least one io_service object.
    	//2.	this class provides access to I/O functionality
    	//3.	declare an object of this type first thing in the main function
    	boost::asio::io_service io;
    
    	//4.	declare an object of type boost::asio::deadline_timer
    	//5.	the core asio classes that provide I/O functionality
    	//		(or as in this case timer functionality)always take a 
    	//		reference to an io_service as their first constructor argument
    	//6.	the second argument to the constructor set the timer to expire 
    	//		5 seconds from now.
    	boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
    
    	//7.	the call to deadline_timer::wait() will
    	//		not return until the timer has expired.
    	//		5 seconds after it was created.
    	SYSTEMTIME sysTimer;
    	GetSystemTime(&sysTimer);
    	std::cout<<sysTimer.wSecond<<std::endl;
    	t.wait();//此时开始计时
    
    	GetSystemTime(&sysTimer);
    	std::cout<<sysTimer.wSecond<<std::endl;
    
    	//差值是5..
    
    }
    //---------------------------------------------------------------------------->
    //Using a timer asynchronously
    //the same head files with class1_Timer()
    void class2_Timer()
    {
    	//1.	using asio's asynchronous functionality means
    	//		having a callback function that will be called
    	//		when an asynchronous operation completes
    	boost::asio::io_service io;
    	boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
    	
    //Main Thread,Thread ID 0x000007a0
    //设置回调.
    	extern void print(const boost::system::error_code &);
    	t.async_wait(print);//此时开始异步计时.
    
    	io.run();//会等待计时器过期
    
    	//1.	io.run()后,这个函数一直运行,此例中io.run()的工作是异步等待定时器t过期.
    	//		当定时器t过期后,io.run()调用设置的回调
    	//2.	如果不设置回调,io_service::run()会立即返回.
    	std::cout <<"Hello,word--Class2_async_Timer!\n";
    
    }
    void print(const boost::system::error_code &)
    {
    //Main Thread,Thread ID 0x000007a0
    	std::cout <<"Hello,word!\n";
    }
    //---------------------------------------------------------------------------->
    //Binding arguments to a handler
    #include "boost/bind.hpp"
    void class3_Timer()
    {
    	boost::asio::io_service io;
    	int count = 0;
    	boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));
    
    	extern void print(const boost::system::error_code&/*e*/,
    					boost::asio::deadline_timer *t,int*count);
    	t.async_wait(boost::bind(print,boost::asio::placeholders::error,&t,&count));//定时器t开始计时
    
    	
    	io.run();//异步等待t过期,并调用回调print,
    			//print重复异步等待计时器,
    	
    	std::cout<<"Final count is" << count <<"\n";
    	return ;
    }
    void print(const boost::system::error_code&/*e*/,
    		   boost::asio::deadline_timer *t,
    		   int*count)
    {
    	if(*count <5)
    	{
    		std::cout << *count <<"\n";
    		++(*count);
    		// move the expiry time for the timer along by one second from the previous expiry time
    		//此处的expires_at是根据第一个async_wait开始计算
    		// 即:在下面的async_wait前断点停止此线程(main thread),计时器线程仍在计时
    		//		main thread停止足够时间,再调用async_wait会立即返回
    		//		async_wait要等待的时间都已经过期.
    		t->expires_at(t->expires_at() + boost::posix_time::seconds(5));
    		t->async_wait(boost::bind(print,boost::asio::placeholders::error,t,count));
    		//注意此处不是递归调用..
    		//只是在函数中将print设置给io作为回调函数,并传递不同的参数...
    		//t->async_wait检测的时间过期即返回.退出print,io取调用新的回调(仍是print)
    	}
    }
    //---------------------------------------------------------------------------->
    //using a member function as a handler
    class printer{
    public:
    	printer(boost::asio::io_service &io)
    		:timer_(io,boost::posix_time::seconds(5))
    		,count_(0)
    	{
    		//所有的noe-static成员函数都有this参数,需要提供给boost::bind
    		timer_.async_wait(boost::bind(&printer::print,this));
    	}
    	~printer(){
    		std::cout << "final count is " <<count_ <<"\n";
    	}
    	void print()
    	{
    		if(count_ < 5)
    		{
    			std::cout << count_ <<"\n";
    			++count_;
    			timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(5));
    			timer_.async_wait(boost::bind(&printer::print,this));
    		}
    	}
    private:
    	boost::asio::deadline_timer timer_;
    	int count_;
    };
    void class4_Timer(){
    	boost::asio::io_service io;
    	printer prt(io);
    	io.run();
    }
    //---------------------------------------------------------------------------->
    //demonstrates the use of the boost::asio::strand class
    //to synchronise callback handlers in a multithreaded program
    
    //前4个例子都是通过同一个线程调用io.run(),没有handler的同步问题
    //回调是被调用io.run()的线程调用.
    //单线程缺陷
    //		长任务执行期间无法获得回应.
    //		多处理设备无法提升性能
    
    //多线程:当handler处理非线程安全的资源时,需要同步
    #include "boost/thread/thread.hpp"
    class printerMul{
    public:
    	printerMul(boost::asio::io_service &io)
    		:strand_(io),
    		timer1_(io,boost::posix_time::seconds(5)),
    		timer2_(io,boost::posix_time::seconds(5)),
    		count_(0){
    			//被同一个boost::asio::strand warp的handler 将无法并行运行..
    			//一个handler将在另handler开始前完成.
    			//没有被boost::asio::strand dispatch或者被不同的boost::asio::strand dispatch的handler将仍会并行执行
    			timer1_.async_wait(strand_.wrap(boost::bind(&printerMul::print1,this)));
    			timer2_.async_wait(strand_.wrap(boost::bind(&printerMul::print2,this)));
    	}
    	~printerMul(){
    		std::cout << "Fianl count is " <<count_ <<"\n";
    	}
    	void print1()
    	{
    		
    		if(count_ <10)
    		{
    			std::cout<<GetCurrentThreadId() <<" ";
    			std::cout<<"Timer1:"<<count_<<"\n";
    			++count_;
    			timer1_.expires_at(timer1_.expires_at() \
    				+ boost::posix_time::seconds(2));
    			timer1_.async_wait(strand_.wrap(boost::bind(&printerMul::print1,this)));
    		}
    	}
    	void print2()
    	{
    		
    		if(count_ < 10)
    		{
    			std::cout<<GetCurrentThreadId() <<" ";
    			std::cout <<"Timer2:"<<count_<<"\n";
    			++count_;
    			timer2_.expires_at(timer2_.expires_at()\
    				+boost::posix_time::seconds(4));
    			timer2_.async_wait(strand_.wrap(boost::bind(&printerMul::print2,this)));
    		}
    	}
    private:
    	boost::asio::strand strand_;
    	boost::asio::deadline_timer timer1_;
    	boost::asio::deadline_timer timer2_;
    	int count_;
    };
    void class5_Timer(){
    	boost::asio::io_service io;
    	printerMul prt(io);
    //io.run()被两个线程调用..
    	//1.被boost::thread t 线程调用
    	boost::thread t(boost::bind(&boost::asio::io_service::run,&io));
    
    	//2.被主线程调用
    	io.run();//(疑问:貌似执行过主线程的io.run()才激活boost::thread t的io.run()?)
    
    	//print1 与print2两个函数不会同时执行,也不固定谁在哪个线程执行..
    
    	t.join();
    	//Main Thread ID:0x00000bd0 (3024
    	//共3个线程
    		//3024 main
    		//1560 boost::thread created
    		//3rd 应该是计时线程..
    	//cout<<
    		//1560 Timer2:0
    		//3024 Timer1:1
    		//1560 Timer1:2
    		//3024 Timer1:3
    		//1560 Timer2:4
    		//3024 Timer1:5
    		//1560 Timer1:6
    		//3024 Timer2:7
    		//3024 Timer1:8
    		//3024 Timer1:9
    		//Fianl count is 10
    }
    int main()
    {
    	int a = 1;
    	while(0 != a)
    	{
    		std::cout << "input your choice"<<std::endl;
    		std::cin >> a;
    		switch(a)
    		{
    		case 1:class1_Timer();
    			break;
    		case 2:class2_Timer();
    			break;
    		case 3:class3_Timer();
    			break;
    		case 4:class4_Timer();
    			break;
    		case 5:class5_Timer();
    			break;
    		case 6:
    			{
    				extern void class6();
    				class6();
    			}
    			 break;
    		default:break;
    		}	
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    <Redis> 入门六 主从复制方式的集群
    <Redis> 入门五 持久化RBD/AOF
    <Redis> 入门四 Jedis操作Redis
    <Redis> 入门三 事务
    <Redis> 入门X 分布式锁
    <Redis> 入门二 五种数据类型的操作、通用key的操作、发布订阅
    <Redis> 入门一 概念安装
    <Linux> 下安装和卸载JDK
    <ActiveMQ>
    <linux>入门
  • 原文地址:https://www.cnblogs.com/ezhong/p/2856321.html
Copyright © 2020-2023  润新知