boost::asio学习之[一]

来源:互联网 发布:淘宝卖家不发货会怎样 编辑:程序博客网 时间:2024/06/05 02:23

#pragma once#include <iostream>#include <boost/date_time/posix_time/posix_time.hpp>#include <boost/asio.hpp>#include <boost/bind.hpp>#include <boost/thread.hpp>namespace IO{using namespace boost::asio;    //同步定时器void fun_01(){io_service ios;deadline_timer t(ios, boost::posix_time::seconds(2));t.wait();}//异步定时器void handle_call_back(const boost::system::error_code& error){if (!error){std::cout << "hand_call back is running\n";}}void fun_02(){io_service ios;deadline_timer t(ios, boost::posix_time::seconds(2));t.async_wait(&handle_call_back);std::cout << "this is first output befor handle call back\n";ios.run();}   //实用bindvoid handle_call_back(const boost::system::error_code& error, deadline_timer* t, int& count){//void handle_call_back(const boost::system::error_code& error, deadline_timer& t, int& count)//会报错,why,count为引用,可是最后还是0?if (!error){if (count < 5){std::cout << count++ << std::endl;t->expires_at(t->expires_at() + boost::posix_time::seconds(1));t->async_wait(boost::bind(handle_call_back, placeholders::error, t, count));}}}void fun_03(){io_service ios;deadline_timer t(ios, boost::posix_time::seconds(1));        int count = 0;t.async_wait(boost::bind(handle_call_back, placeholders::error, &t, count));        ios.run();std::cout << "final count : " << count << std::endl;}//类的成员函数as a handleclass test_class{public:test_class(io_service& io, int count):t_(io, boost::posix_time::seconds(1)), count_(count){start_asy();}~test_class(){std::cout << "final count : " << count_ << std::endl;}void start_asy(){t_.async_wait(boost::bind(&test_class::handle_call_back, this, placeholders::error));}private:void handle_call_back(const boost::system::error_code& error){if (!error){if (count_ < 5){std::cout << count_++ << std::endl;t_.expires_at(t_.expires_at() + boost::posix_time::seconds(1));t_.async_wait(boost::bind(&test_class::handle_call_back, this, placeholders::error));}}}private:int count_;deadline_timer t_;};void fun_04(){io_service io;test_class test(io, 0);io.run();}//使用boost::asio::strand 类来创建多线程程序中的同步回调句柄class test_strand{public:test_strand(io_service& io, int count):strand_(io),     t1_(io, boost::posix_time::seconds(1)),  t2_(io, boost::posix_time::seconds(1)), count_(count){start_asy();}~test_strand(){std::cout << "final count : " << count_ << std::endl;}void start_asy(){t1_.async_wait(strand_.wrap(boost::bind(&test_strand::handle_call_back1, this, placeholders::error)));t2_.async_wait(strand_.wrap(boost::bind(&test_strand::handle_call_back2, this, placeholders::error)));}private:void handle_call_back1(const boost::system::error_code& error){std::cout << "handle_call_back1 is called!\n";if (!error){if (count_ < 10){std::cout << count_++ << std::endl;t1_.expires_at(t1_.expires_at() + boost::posix_time::seconds(1));t1_.async_wait(strand_.wrap(boost::bind(&test_strand::handle_call_back1, this, placeholders::error)));}}}void handle_call_back2(const boost::system::error_code& error){std::cout << "handle_call_back2 is called!\n";if (!error){if (count_ < 10){std::cout << count_++ << std::endl;t2_.expires_at(t2_.expires_at() + boost::posix_time::seconds(1));t2_.async_wait(strand_.wrap(boost::bind(&test_strand::handle_call_back2, this, placeholders::error)));}}}private:int count_;strand strand_;deadline_timer t1_;deadline_timer t2_;};void fun_05(){io_service io;test_strand test(io, 0);boost::thread t(boost::bind(&io_service::run, &io));io.run();t.join();}/*/////////////////////////////////////////////////////////////////////////说明:1,在主函数中,boost::asio::io_service::run() 现在被两个线程调用:主线程和一个附加线程。这一切依赖于boost::thread对象来完成。   正如它被一个单线程调用一样,boost::asio::io_service::run() 的并发调用会一直持续到无任何“工作”可做。后台线程直到所有异步   操作都完成后才会退出。2, 在一个多线程程序中,当访问同一共享资源时,异步操作必须是同步的。在本例中,handl1和handl2函数使用的共享资源为std::cout 和count_数据成员。3, 除了初始化一对boost::asio::deadline_timer 成员变量外,构造函数还初始化一个boost::asio::strand类型的strand_成员变量。boost::asio::strand 对象保证:对于通过它来分派执行的众操作中,只有一个操作执行完成之后才允许进入下一个操作。这种保证与多少个线程调用boost::asio::io_service::run()无关。当然,如果不是通过一个boost::asio::strand对象分派,或者通过其它不同的boost::asio::strand对象分派,这些操作仍旧可能是并发的/*/////////////////////////////////////////////////////////////////////////class test_strand_2{public:test_strand_2(io_service& io, int count):strand_(io),t1_(io, boost::posix_time::seconds(1)), t2_(io, boost::posix_time::seconds(1)),count_(count){start_asy();}~test_strand_2(){std::cout << "final count : " << count_ << std::endl;}void start_asy(){t1_.async_wait(boost::bind(&test_strand_2::handle_call_back1, this, placeholders::error));t2_.async_wait(boost::bind(&test_strand_2::handle_call_back2, this, placeholders::error));}private:void handle_call_back1(const boost::system::error_code& error){std::cout << "handle_call_back1 is called!\n";if (!error){if (count_ < 10){std::cout << count_++ << std::endl;t1_.expires_at(t1_.expires_at() + boost::posix_time::seconds(1));t1_.async_wait(boost::bind(&test_strand_2::handle_call_back1, this, placeholders::error));}}}void handle_call_back2(const boost::system::error_code& error){std::cout << "handle_call_back2 is called!\n";if (!error){if (count_ < 10){std::cout << count_++ << std::endl;t2_.expires_at(t2_.expires_at() + boost::posix_time::seconds(1));t2_.async_wait(boost::bind(&test_strand_2::handle_call_back2, this, placeholders::error));}}}private:int count_;strand strand_;deadline_timer t1_;deadline_timer t2_;};void fun_06(){io_service io;test_strand_2 test(io, 0);boost::thread t(boost::bind(&io_service::run, &io));io.run();t.join();}}

0 0
原创粉丝点击