728x90
asio io 를 쓰레드에 태워서 서버용 프로그램을 드래그 하더라도 멈추지 않게끔 된다
쓰레드에서 도는 두개의 타이머와 공유되는 변수를 통해 threadsafe 함을 보이고 strand 로 callback 을 관리하는 것을 볼 수 있다
예제 코드
#include "stdafx.h" #include < boost/thread.hpp> #include < boost/bind.hpp> #include < boost/date_time/posix_time/posix_time.hpp> class job { private: boost::asio::strand strand_; boost::asio::deadline_timer timer1_; boost::asio::deadline_timer timer2_; int count_; public: job(boost::asio::io_service& io) : strand_(io), timer1_(io, boost::posix_time::seconds(1)), timer2_(io, boost::posix_time::seconds(1)), count_(0) { timer1_.async_wait(strand_.wrap(boost::bind(&job::print1, this))); timer2_.async_wait(strand_.wrap(boost::bind(&job::print2, this))); } ~job() { std::cout << "final count " << count_ << std::endl; } void print1() { if(count_ < 10) { std::cout << "Timer1" << ++count_ << std::endl; timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1)); timer1_.async_wait(strand_.wrap(boost::bind(&job::print1, this))); } } void print2() { if(count_ < 10) { std::cout << "Timer2 " << ++count_ << std::endl; timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1)); timer2_.async_wait(strand_.wrap(boost::bind(&job::print2, this))); } } }; int _tmain(int argc, _TCHAR* argv[]) { boost::asio::io_service io; job j(io); boost::thread t(boost::bind(&boost::asio::io_service::run, &io)); io.run(); t.join(); int a; std::cin >> a; return 0; }
728x90
'프로그래밍 > boost' 카테고리의 다른 글
boost::asio::buffer (0) | 2011.10.28 |
---|---|
boost::asio 비동기 TCP + echo 서버 / 클라이언트 (6) | 2011.10.27 |
boost::asio (0) | 2011.10.27 |
boost 라이브러리 (0) | 2011.10.27 |
boost::lockfree 설치 및 사용법 (0) | 2011.10.24 |
댓글