
Thorsten Froehlich <froetho@iit.edu> writes:
Anthony Williams wrote:
Making this change, the race condition goes away on one more platform using in the boost interface. It should also be considered that relative timeouts in the boost interface certainly eliminate a problem on a platform with a large market share relevant to many boost developers for better or worse ;-)
How does the race condition go away by making everyone use relative timeouts?
You no longer internally (invisible to the user of boost::thread) query the absolute time makes it go away for Windows. And setting the clock condition attribute CLOCK_MONOTONIC with POSIX would make it impossible there as far as I can tell, does it not?
I've updated the implementation of boost::condition_variable and boost::condition_variable_any to allow for relative timeouts as well as absolute timeouts on the predicate version of timed_wait. On POSIX, the timeouts are always absolute under-the-hood, so a relative timeout is converted into an absolute one. On Windows, the relative and absolute timeouts are now treated differently. If an absolute timeout is specified (using boost::xtime or boost::system_time), then this is converted into a relative timeout immediately prior to each internal wait by comparison against the system clock. If the clock is changed, then this may or may not affect the duration of the wait, depending on whether the clock change occurred before or after each wait period. If a relative timeout is specified (using e.g. boost::posix_time::seconds), then the GetTickCount API is used as a baseline for the relative timeout, and before each internal wait the current tick count is compared against the baseline in order to determine the remaining time. Note that the non-predicate version of timed_wait still only takes an absolute time, because the potential for spurious wake-ups makes it hard to use correctly with a relative time, as demonstrated by the bug in APR. Anthony -- Anthony Williams Just Software Solutions Ltd - http://www.justsoftwaresolutions.co.uk Registered in England, Company Number 5478976. Registered Office: 15 Carrallack Mews, St Just, Cornwall, TR19 7UL