Boost logo

Boost :

From: Yuval Ronen (ronen_yuval_at_[hidden])
Date: 2007-08-22 13:07:09

Howard Hinnant wrote:
> On Aug 22, 2007, at 11:22 AM, Yuval Ronen wrote:
>> Howard Hinnant wrote:
>>> On Aug 22, 2007, at 8:05 AM, Yuval Ronen wrote:
>>>> Yuval Ronen wrote:
>>>>> Howard Hinnant wrote:
>>>>>> Because of this, it is
>>>>>> not possible (in the above use case) for there to be a set_mutex
>>>>>> on
>>>>>> the condition to change the facade, since both facades are
>>>>>> simultaneously in use.
>>>>> Yes, I've realized that too late. My set_mutex() function is
>>>>> useless
>>>>> because it has to be atomic with the wait().
>>>> I've just thought that it might be not so useless after all.
>>>> 'set_mutex'
>>>> is supposed to be called after the mutex was locked, and before
>>>> calling
>>>> condition::wait. Because the mutex is locked, we are protected
>>>> against
>>>> simultaneous use. There can be a problem when multiple readers lock
>>>> for
>>>> read, and simultaneously call set_mutex, but if we assume they all
>>>> set
>>>> the same mutex it shouldn't be a problem.
>>> How would wake from wait be handled? I.e. what mutex (facade) would
>>> it use to lock with? The last one set may not correspond to the
>>> proper one on wake.
>> It would lock the same mutex it unlocked upon entering wait().
> Could you prototype or sketch this out? Sorry, I'm not following.

Perhaps some code will help me clarify my ideas (taking your advice :) ):

template <class Mutex>
class condition
     typedef Mutes mutex_type;
     mutex_type *m_mutex;

     condition() : m_mutex(NULL) { }
     explicit condition(mutex_type &a_mutex) : m_mutex(&a_mutex) { }

     void set_mutex(mutex_type &a_mutex) { m_mutex = &a_mutex; }

     void wait()
         assert(m_mutex); // overhead only in debug builds

Of course that's a very partial implementation, but I hope it's enough
to convey my intent.

Boost list run by bdawes at, gregod at, cpdaniel at, john at