Hi Folks,

I am using boost 1.36, and I have a C++ class that wraps calls to boost::asio sockets. There are two important functions:

WriteData -- takes a vector of uint8_t's and uses async_write.
WaitForPreviousWritestoComplete -- Here the user expects to block until all their previous writes are complete. Effectively this just calls io_service.run().

A user of this class can will WriteData a few times, and then do some other processing for a bit while the async_write is happening in the background, and then they should block at io_service.run() until the writes complete (and error status etc is checked).

It was my understanding that io_service.run() call would block the thread of execution at that point until the pending writes on my output socket were complete.

Am I wrong in my interpretation, because I see the user effectively doing:
async_write
async_write
async_write
io_service.run()
async_write
async_write
io_service.run()


The first call to io_service.run() correctly calls my message handler 3 times, for the 3 writes. The second call to io_service.run() I expect to see the handler called twice, but it is not called at all!

If I get a bit tricky and do something like:
async_write
async_write
async_write
while (!all_writes_comple_flag){
    io_service.run()
}

(the handler will set all_writes_comple_flag when all writes are complete :) ) then the code is effectively busy waiting at that point until it is done, but I do see the handler entered when I expect.

Is there some timing issue occurring here? Perhaps the thread that is managing the socket stuff not had a chance to register that it has a pending write waiting?


Am I misinterpreting what boost means in the documentation by saying the io_service.run() function blocks? If I am, what should I do to wait until all asynchronous writes are complete?

thanks

Nick