On Mon, Jun 18, 2007 at 10:48:14AM -0500, Graham Reitz wrote:
Is there a method to release all threads waiting on a mutex? Or, more generally, a portable way to release a bunch of threads at the same time? (boost::asio?)
I didn't see anything in the docs, besides barrier. Unfortunately, I can't guarantee the N threads will be waiting when a flush is needed.
You want a SYSV-style semaphore (semget/semop/semctl in POSIX; seems not to be provided by Boost.Thread). Given N threads: 1. Initialize the semaphore to 0. 2. In every thread that wants to "lock", try to subtract 1 from the semaphore. Since this would cause the semaphore to become negative, the thread will sleep. 3. When you want to release all the threads, set the semaphore value to N. The K threads that may already be waiting on the semaphore shall be unblocked and the semaphore value will be decremented to N-K after they all wake up. The remaining N-K threads which will subsequently try to lock the semaphore will always succeed in decrementing it by 1, and will be again allowed to proceed.