[M3devel] condition variables/win32
Tony Hosking
hosking at cs.purdue.edu
Thu Oct 8 16:09:31 CEST 2009
In general, it is OK in M3 to associate multiple conditions with the
same mutex. But not vice versa.
On 8 Oct 2009, at 09:32, Jay K wrote:
> condition variables/win32
>
>
> So..one way I think about condition variables
> is that you want to be woken when someone else
> leaves the mutex that guards the data that you are dealing with.
> You want to know when another thread modifies the data.
> (If you have a reader/writer lock, you only want to be
> woken when someone exits a write.)
>
>
> Now, if you consider a producer/consumer queue.
> There are two interesting occurences.
> Transitions from empty to non-empty
> and transitions from full to non-full (optionally,
> if it is fixed size).
>
>
> Consumers wait for empty to non-empty.
> Consumers signal full to non-full.
> Producers wait for full to non-full.
> Producers signal non-empty to empty.
>
>
> So, in this case, one mutex is likely used with with two condition
> variables.
>
>
> But, what if we take a simplifying deoptimization and assume that a
> condition
> variable is only ever associated with one mutex?
> Anyone existing that mutex wakes up anyone waiting on any condition
> associated with it?
> Like, a condition variable I think becomes stateless and everything is
> about the mutex?
>
>
> What is the downside?
>
>
> Condition variables are allowed to have spurious wakeups.
> This would "just" increase them. Too much?
>
>
> So, therefore, what would be wrong with the following design?
> a mutex contains an event
> and a number of waiters, zero or non-zero
> if a mutex is exiting with a non-zero number of waiters, signal the
> event
>
>
> To handle Signal vs. Broadcast
> method 1:
> the number of waiters might be interlocked
> the woken would decrement it
> if it isn't zero, signal the event again
>
>
> method 2:
> the number of waiters is both an integer and a semaphore
> and the lock exiter raises the semaphore by the the integer
>
>
> method 3:
> it is not an auto-reset event and there is a count
> and when the count goes to 0, reset the event
> I think in this case you have to maintain a "wait generation"
> so that new waiters don't prevent the count from ever hitting 0.
> I think this #3 is what Java might be doing, and is described here:
> http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
> "3.3. The Generation Count Solution"
>
>
> also:
> http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
> 3.2. The SetEvent Solution
> Evaluating the SetEvent Solution
> Incorrectness --
>
>
> Is that incorrect case really necessarily incorrect?
> It seems unfair, since first waiter should be first woken, but..?
>
>
> Am I missing something? A lot?
>
>
> - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20091008/b18d0fde/attachment-0002.html>
More information about the M3devel
mailing list