Hi,
Thanks Zachary, yes, I have made a typo, thanks for pointing to it,
and for the explanation.
But it I have the same question for your code since we have a similar
(interleaved) output.
What I understood was, when we call io.run, main thread is suspended until
things assigned to it finishes.
(that is why in the examples the final count is not printed before an
io.run() completes, right?!)
so how come io2.run() is invoked from main thread (before io.run() finishes)
(and we can get interleaved results)?
Something I must be getting wrong.
TIA,
Best regards,
Ozgur (Oscar) Ozturk
www.DrOzgur.com
+1 (614) 805-4370
On Sat, Jul 11, 2009 at 5:33 PM, Zachary Turner
It might help to think of a single io_service *instance* as a single event loop. When you invoke run() on instance X of an io_service from thread Y, then X is allowed to post notifications to thread Y when an event happens on that io_service. So, for example, if you have one io_service and you invoke run() from 5 threads on the same instance, then the all 5 threads will be participating in the event loop for this instance of io_service. It is undefined which thread will receive notification of an event, only that exactly 1 of the threads in the event loop will wake up when something happens.
So if you have 2 io_service instances, then the output can be interleaved if you call run from multiple threads.
In your program, you declare 2 io_services, but you actually only use one. Maybe this is a typo? io2 isn't even used, so io2.run() just returns instantly. I also rewrote your code a little. It helps to print out the time until expiration for each timer.
boost::asio::io_service io,io2; boost::asio::deadline_timer* timer1; boost::asio::deadline_timer* timer2;
void print(const boost::system::error_code& /*e*/, boost::asio::deadline_timer* t, int* count) { if (*count < 5) { ++(*count);
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
std::cout << *count << ": " << ((t==timer1)?"timer1":"timer2") << ", t1exp: " << timer1->expires_from_now() << ", t2exp: " << timer2->expires_from_now() << std::endl;
t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count)); } }
int main() { int count = 0; timer1 = new boost::asio::deadline_timer(io, boost::posix_time::seconds(1)); timer2 = new boost::asio::deadline_timer(io, boost::posix_time::seconds(1));
std::cout << "[start]: t1exp: " << timer1->expires_from_now() << ", t2exp: " << timer2->expires_from_now() << std::endl;
timer1->async_wait(boost::bind(print, boost::asio::placeholders::error, timer1, &count)); timer1->expires_at(timer1->expires_at() + boost::posix_time::seconds(1));
timer2->async_wait(boost::bind(print, boost::asio::placeholders::error, timer2, &count));
io.run(); io2.run();
std::cout << "Final count is " << count << "\n";
int discard; std::cin>>discard; return 0; }
[start]: t1exp: 00:00:01, t2exp: 00:00:01 1: timer1, t1exp: 00:00:03, t2exp: 00:00:01 2: timer2, t1exp: 00:00:02, t2exp: 00:00:01 3: timer2, t1exp: 00:00:01, t2exp: 00:00:01 4: timer2, t1exp: 00:00:00, t2exp: 00:00:01 5: timer1, t1exp: 00:00:01, t2exp: 00:00:01 Final count is 5
Does this make it clearer why it's behaving the way it is? _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users