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