|
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;
public:
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
do_wait(*m_mutex);
}
};
Of course that's a very partial implementation, but I hope it's enough
to convey my intent.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk