Boost logo

Boost Users :

Subject: [Boost-users] [asio] sync operations with timeout
From: Gennady Proskurin (gprspb_at_[hidden])
Date: 2011-08-30 09:32:04


Hello.

I write network library which offers blocking socket operations (connect, read,
write, ...) with timeouts, using boost::asio asynchronous operations as
implementation. It is actually some sort of wrapper around boost::asio.
Implementation does something like this (read, for example):

do_read()
{
        timer.async_wait(&handle_timer)
        socket.async_read(..., handle_read);
        wait_for_all_handlers();
        deal_with_ec();
}

handle_timer() { socket.cancel(); }
handle_read() { timer.cancel(); }

I have one io_service for all the sockets/timers with one thread doing
io_service::run(). Code is multithreaded, so many threads run that functions
like do_read() simultaneously (for different sockets, of course).

I have two questions:

1. How to wait for completion of all handlers? Currently I use shared_ptr with
mutex+condvar (for each library call), it works fine, but seems to be too
heavy-weight.

2. There is a chance (with small timeouts), that timer expires before
async_read() is started, so sock.cancel() is no-op in handle_timer(), and timer
will be disabled. Currently, I just ignore this. I can use another mutex (or
strand) to protect from this, but it is also heavy-weight.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net