Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-07-19 11:41:01


Alexander Terekhov wrote:
>
> With respect to swap_based_mutex_for_windows thing (without
> pimpl-and-never-destroyed-impl), the problem is that it can go boom
> in unlock().
>
> void lock() throw() {
> if (m_lock_status.swap(1, msync::acq))
> while (m_lock_status.swap(-1, msync::acq))
> m_retry_event.wait();
> }
>
> void unlock() throw() {
> if (m_lock_status.swap(0, msync::rel) < 0)
> m_retry_event.set();
> }
>
> Scenario...
>
> Given: mutex protected refcounting. Two threads, A and B.
>
> t0: thread A locks the mutex and decrements refcount to 2;
>
> t1: thread B does m_lock_status.swap(1, msync::acq) on the
> fast path and sees 1;
>
> t2: thread A unlocks the mutex (doesn't enter slow path);
>
> t3: thread B does mutex m_lock_status.swap(-1, msync::acq),
> locks the mutex, decrements refcount to 1, does
> m_lock_status.swap(0, msync::rel) and enters slow path
> in unlock();

    SetEvent( e_ );

> t4: thread A locks the mutex, decrements refcount to 0,
> unlocks the mutex, and destroys it (including event);

    CloseHandle( e_ );

> t5: thread B goes BOOM.

Does it? The Win32 kernel is pretty resilient. ;-) We'll have to try it, I
guess.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk