|
Boost : |
From: Martin Bonner (martin.bonner_at_[hidden])
Date: 2006-09-19 12:39:40
----Original Message----
From: boost-bounces_at_[hidden]
[mailto:boost-bounces_at_[hidden]] On Behalf Of Anthony Williams
Sent: 19 September 2006 17:02 To: boost_at_[hidden]
Subject: Re: [boost] win32 mutex and condition variable algorithms
> "Martin Bonner" <martin.bonner_at_[hidden]> writes:
>
>> From: boost-bounces_at_[hidden]
>> [mailto:boost-bounces_at_[hidden]] On Behalf Of Anthony Williams
>>> The mutex is simple, and you can see the code in
>>> boost/thread/win32/basic_mutex.hpp on the thread_rewrite branch.
>>>
>>
>> I'm missing something here (I hope).
>>
>>> The algorithm is:
>>>
>>> init():
>>> active_count=0;
>>> no semaphore
>>>
>>> lock():
>>> atomic increment active_count
>>
>> At this point, thread2 atomically increments active_count as well,
>> so it is now 2.
>>
>>> if new active_count ==1,
>>> that's us, so we've got the lock
>>> else
>>> get semaphore, and wait
>> Both threads will go into this branch. Why don't they wait forever?
>
> No. The atomic increments are atomic, and return the new value:
^^^^^^^^^^^^^^^^^^^^^^^^
That's the bit I had missed. Thanks.
> we don't do an extra read.
> One thread will see "1", and the other "2".
>
>>> now we've got the lock
>>>
>>> unlock():
>>> atomic decrement active_count
>>> if new active_count >0, then other threads are waiting,
>>> so release semaphore.
>>
>>
>> Alternatively,
>>
>> Thread A Thread B
>>
>> locks mutex
>>
>> atomic increment active_count (in lock)
>>
>> atomic decrements active_count (in unlock)
>> new active_count > 0, so other threads are waiting release
>> semaphore ... oops. What semaphore?
>
> Sorry I didn't make it clear. If we go into this branch of unlock, we
> have to call get_semaphore() to get the semaphore to release. This
> ensures that there is one and only semaphore associated with this
> mutex, which is returned to all callers, and is therefore released
> by the unlock().
>
> Hope that makes things clearer.
It does. I am now reassured that there are no trivially obvious errors.
... which doesn't mean there aren't any errors :-(
-- Martin Bonner Martin.Bonner_at_[hidden] Pi Technology, Milton Hall, Ely Road, Milton, Cambridge, CB4 6WZ, ENGLAND Tel: +44 (0)1223 203894
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk