#include #include #include #include #include using namespace std; using namespace std::tr1; using namespace boost; using namespace boost::asio; using namespace boost::system; using namespace boost::posix_time; class App { public: App(); ~App(); void stop(); void operator () (); bool Done(); private: void handle_stop(); private: io_service m_io; bool m_stop; bool m_done; shared_mutex done_mut; shared_mutex stop_mut; }; int main() { App app; int x = 0; while(!app.Done()) { app(); this_thread::sleep(millisec(100)); if(++x == 10) app.stop(); } return EXIT_SUCCESS; } App::App() : m_io(), m_stop(false), m_done(false) {} App::~App() {} bool App::Done() { shared_lock l(done_mut); return m_done; } void App::stop() { cout << "qeueueing stop handler" << endl; m_io.dispatch(bind(&App::handle_stop, this)); } void App::operator () () { bool run = m_io.poll_one() >= 0; cout << "operator (): " << boolalpha << "!run: " << !run << " m_stop: " << m_stop << endl; shared_lock l1(stop_mut); if(!run && m_stop) { unique_lock l2(done_mut); m_done = true; } } void App::handle_stop() { cout << "signaling m_io to stop" << endl; unique_lock l(stop_mut); m_stop = true; }