본문 바로가기
프로그래밍/boost

boost::asio 쓰레드, 타이머, Strand 의 사용법 예제

by neive 2011. 10. 27.
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

댓글