vendredi 25 décembre 2015

Get notification in Asio if `dispatched` or `post` have finished

I want to know when dispatchhas finished with some specific work

service.dispatch(&some_work);

I want to know this because I need to restart some_work if it has finished.

struct work
{
  std::shared_ptr<asio::io_service> io_service;
  bool ready;
  std::mutex m;
  template <class F>
  void do_some_work(F&& f)
  {
    if (io_service && ready) {
      m.lock();
      ready = false;
      m.unlock();
      io_service->dispatch([&f, this]() {
        f();
        m.lock();
        ready = true;
        m.unlock();
      });
    }
  }
  work(std::shared_ptr<asio::io_service> io_service)
    : io_service(io_service)
    , ready(true)
  {
  }
};

int
main()
{
  auto service = std::make_shared<asio::io_service>();
  auto w = std::make_shared<asio::io_service::work>(*service);
  std::thread t1([&] { service->run(); });

  work some_work{ service };
  for (;;) {
    some_work.do_some_work([] {
      std::cout << "Start long draw on thread: " << std::this_thread::get_id()
                << std::endl;
      std::this_thread::sleep_for(std::chrono::seconds(5));
      std::cout << "End long draw on thread: " << std::this_thread::get_id()
                << std::endl;
    });
  }
  w.reset();
  t1.join();
}

There are some problems with the code, for example if some_workgoes out of scope, then the running taskwould still write to ready.

I am wondering if something like this already exists in Asio?

Aucun commentaire:

Enregistrer un commentaire