Boost logo

Boost Users :

Subject: Re: [Boost-users] [asio] posting a function to an io_service object
From: Igor R (boost.lists_at_[hidden])
Date: 2009-12-28 16:32:09

> My problem is with the function that is to be executed last: how can I wait for that to be executed before stopping the io_service and joining the thread?

Usually you don't have to stop io_service explicitly - when it runs
out of work, it stops by its own. So if all you need is to perform
several functions/functors on io_service thread - just post them to
io_service, and join io_service thread(s):

// pseudo-code!
  asio::io_service io;;;
  thread t(&io_service::run, &io);
  t.join(); // when io_service runs out of jobs, run() exits.

If you need to get more control over io_service::run "lifetime", you
can use work object, like in your example:

// pseudo-code!
  asio::io_service io;
  shared_ptr<io_service::work> work(new io_service::work(ios));
  thread t(&io_service::run, &io);;;
  // do something...
  // when there's not more real work, and all the copies of "work"
shared ptr are reset, io_service::run will exit

If you still need to get synchronized with one of your functors being
executed in another thread, use boost::condition_variable (the functor
sets condition, main thread waits for condition):

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at