Le 11/02/13 12:13, Stefan Djukic a écrit :
Hi guys,

Recently, I had to make a decision about which synchro mechanism to use for a new project for which the target OS should be Windows and/or Solaris/Linux. So, I've finally decided to dig deeper into the Boost thread lib, and have started with the most fundamental one, the mutex (for Windows, of course). At first it was very hard to crack it, but soon enough, the things have started to get their logic. Now, the logic behind it seems pretty much ok, with one small exception. No matter how hard I've tried to understand it, it keeps to be elusive. I've tried, also, to google about it, but surprisingly not much was posted on the subject (or I was looking on the wrong side).
So, I cannot understand what is the point of using the old_count as the input value in void basic_timed_mutex::clear_waiting_and_try_lock(long& old_count). At that point, the old_count in all threads waiting on mutex would be less than the current value of active_count (the way it is done in mark_waiting_and_try_lock()). 
In the first iteration of clear_waiting_and_try_lock() the value of the old_count will always be compared to active_count, and after that, as it would be different, use its current value for the next iteration. So, what's the point of the first iteration? On the other hand, it seems planned very carefully to do exactly that, but I cannot see why. Why not instead of the line old_count&=~lock_flag_value; set the old_count to zero, or even better to: old_count=active_count&~lock_flag_value;, that way, at least, one thread could obtain the lock in the first iteration. It also seems, that the first versions of mutex (prior to rev 45119), would not have this first extra iteration.
Anyway, I do not see much harm in the way it's done, but not much benefit, either.


I don't know well the windows implementation. I don't have too much time now to study the code. I will come back to this issue as soon as possible.

For the time been, please, could you try to patch with some of the ideas you have and see if the complete regression tests are working yet. If it is the case a performance comparison will be useful. If not this will give you some hints on why the things are done currently.