On Thursday, April 12, 2012 10:02 AM, Andreas Wehrmann wrote:
The question is: When the worker thread is currently executing work (of which there may be a lot) which the high priority thread previously posted to it, is the io_service locked?; so that calls to io_service::post() block until the io_service is done?
No. io_service::post will not block until the previous work items are done.
I came to this question because I saw that in ::post() there is a lock involved protecting access to the operations queue.
Although I'm not an expert of asio, I suspect io_service::run holds that lock for very short periods. Probably similar to the following pseudocode: 1: Wait until an operation is in the queue. 2: Acquire the lock. 3: Try to remove an operation from the operations queue. Don't wait if another thread already removed it between steps 1 and 2. 4: Release the lock. 5: Run the operation if we got one.