Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the definition of a boost::asio::io_service ready handler?

I am trying to understand the difference between io_service's poll()/poll_one() and run()/run_one(). The difference as stated in the documentation is that poll() executes ready handlers as opposed to run() which executes any handler.

But nowhere in the boost documentation could I find the definition of a 'ready handler'.

A valid answer to this question is one able to show, preferably with a code example, the difference between a ready and non-ready handler and the difference between how poll() and run() executes it.

Thanks.

like image 700
EddieBytes Avatar asked Jan 29 '13 07:01

EddieBytes


People also ask

What is Boost :: ASIO :: io_service?

Asio defines boost::asio::io_service , a single class for an I/O service object. Every program based on Boost. Asio uses an object of type boost::asio::io_service . This can also be a global variable. While there is only one class for an I/O service object, several classes for I/O objects exist.

Is ASIO part of boost?

Boost library consists of asio which is a free, cross-platform C++ library for network and low-level I/O programming that provides a consistent asynchronous model using a modern C++ approach. This article will help to develop a client-server synchronous chatting application using boost::asio.

What is boost ASIO post?

boost::asio::post takes any callable object. Requirements for such object you can find here. There are many ways to achive what you want: [1] lambda expressions boost::asio::post(tp, [i]{ printProduct(i); });

Is boost ASIO header only?

By default, Boost. Asio is a header-only library. However, some developers may prefer to build Boost. Asio using separately compiled source code.


2 Answers

A "ready handler" is a handler that is ready to be executed. If you have issued an asynchronous call, it gets executed in the background and its handler becomes ready when the async call is done. Before that, the handler is pending, but not ready.

  • poll_one executes one ready handler if there is any.
  • poll executes all ready handlers, but not the pending. Both poll versions return immediately after the execution of the handlers.
  • run_one executes a ready handler if there is one, if not it waits for the first pending handler to become ready, meaning it blocks.
  • run executes and waits, until there are neither ready nor pending handlers. After it returns, the io_servie is in stopped state.

See also Boost::Asio : io_service.run() vs poll() or how do I integrate boost::asio in mainloop

like image 174
Arne Mertz Avatar answered Sep 30 '22 13:09

Arne Mertz


int main()
{
    boost::asio::io_service io_service;
    boost::asio::deadline_timer timer(io_service);

    timer.expires_from_now(boost::posix_time::seconds(5));
    timer.async_wait([](const boost::system::error_code& err)
                     { std::cout << (err ? "error" : "okay")
                     ;});

    //io_service.poll_one(); 
    io_service.run_one();
}

If you use io_service.poll_one(); you will most likely not see any output because the timer has not elapsed yet. ready handler simply means a handle that is ready to run (such as when a timer elapses or an operation finishes, etc.). However, if you use io_service.run_one(); this call will block until the timer finishes and execute the handler.

like image 41
Jesse Good Avatar answered Sep 30 '22 15:09

Jesse Good