I found the blogs by real-time OS guys (RTOS) have more interesting opinions on the finer points. They are the ones who are down in the trenches. cheers -ben
On Sat, Jan 9, 2016 at 4:17 AM, stepharo <steph...@free.fr> wrote: > thanks for the summary. > I think that this is important to update the class comments with the comment > of ben. > I read several blogs of mutex vs semaphore and this is nice to get this > cleared out. > > Stef > > Le 7/1/16 14:05, Denis Kudriashov a écrit : > > Hi. > > We got interesting discussion about semaphore and mutex. Here I put summary > of proposed changes. > > First we will deprecate Semaphore>>forMutualExclusion and rename it to > Semaphore>>newSignalled. Explanation from Ben Coman: > >> Semaphore>>forMutualExclusion *encourages* people to believe >> semaphores can be used *on*their*own* for mutual exclusion, when they >> *shouldn't*. You *must* add ownership. If the mutual exclusion >> object doesn’t have ownership then, irrelevant of what it is called, >> it is not a mutex!!! [1]. > > And more: >> >> With an implementation like.. >> Semaphore>>forMutualExclusion >> ^self new signal >> we don't gain a lot, and its a misleading convenience method since its >> doesn't provide the proper facility for mutual exclusion (and I do >> conflate mutual exclusion == mutex). Indeed, "Semaphore >> forMutualExclusion + roll your ownership management + problems since >> you weren't aware you needed to roll your own ownership management" is >> not more convenient than "Mutex new" >> If you want to keep a convenience method for a pre signalled >> Semaphore, then we could provide something like "Semaphore >> newSignalled" > > > It is also explain why we should deprecate Semaphore>>critical: and use > Mutex>>critical: instead. That's second change. > > So we want to move 4 Semaphore methods to Mutex: > > critical: mutuallyExcludedBlock > > It will relies on new Semaphore method waitIfInterrupted: which block is > executed when waiting process terminated at point where lock was not > acquired. Slice for this already in inbox. > > critical: mutuallyExcludedBlock ifCurtailed: terminationBlock > critical: mutuallyExcludedBlock ifError: errorBlock > > Semantic of this method is like BlockCosure>>ifError:. It culls error > properties to handler block. It will be changed to cull only error instance. > It will touch WeakArray and WeakRegistry. Now they doing this: > > ifError:[:msg :rcvr| rcvr error: msg]. > > > No special logic inside handler. So we will just use #critical: message. > > critical: mutuallyExcludedBlock ifLocked: alternativeBlock > > It purpose looks like "enter critical section without waiting otherwise > alternativeBlock". But implementation not shows that waiting can not be > happens: > > critical: mutuallyExcludedBlock ifLocked: alternativeBlock > excessSignals == 0 > ifTrue: > [ ^alternativeBlock value ]. > ^self critical: mutuallyExcludedBlock > > When critical message is sent but it method not started interrupt can happen > and other process can lock this semaphore. And when process will be resumed > it will be blocked. > So implementation is not correct to me. It should be changed somehow. > > Welcome for suggestions > > >