[M3devel] userthreads vs. pthreads performance?

Rodney M. Bates rodney_bates at lcwb.coop
Mon Mar 29 17:01:04 CEST 2010



Tony Hosking wrote:
> Guys,
> 
> You are looking in the wrong place.  The whole good thing about having a 
> language-defined thread model is that we get to implement the thread 
> primitives in the language run-time, and we can take advantage of 
> language-specific semantics.   There is no requirement that a Modula-3 
> mutex even map to a pthread_mutex_t.  Java monitors are implemented in 
> modern JVMs so that lock/unlock in the common case doesn't require any 
> calls or any atomic operations!  We can do much the same for Modula-3. 
>  My group at Purdue has done a fair amount of work on this in the 
> context of Java, and when I can find the time I was hoping to do the 
> same for Modula-3.  The only requirement for M3 was that we have proper 
> support for atomic ops in the language upon which to build the 
> synchronisation primitives.  We are close to having this now.  Let me 
> sketch a design:
> 
> The common case is that a mutex is only ever manipulated by one thread 
Do you mean _almost_ only ever? -----^ Otherwise, why would it have been
coded with a mutex at all?

> (i.e., never shared), in which case it suffices to "bias" the mutex to 
> that thread.  Locking/unlocking is simply a matter of checking to see 
> that the bias belongs to the current thread.  No need for an atomic 
> operation.  If the thread already has the bias then locking/unlocking is 
> simply a matter of setting a bit in the mutex.  If another thread comes 
> along and needs to lock the mutex then it must first revoke the bias of 
> the owning thread.  This can be expensive (assuming it occurs 
> infrequently) and in our case probably means stopping the thread having 
> the bias, revoking the bias, then restarting it.
> 
> Another case is when a mutex is locked/unlocked by multiple threads but 
> there is never contention (i.e., no thread tries to acquire while 
-----------^ and _almost_ never?

> another thread holds).  In this case we never need a wait queue for the 
> mutex so we can simply store the lock owner in the mutex and test using 
> atomic ops.  Spinning is often useful here to avoid needing to inflate 
> if contention ever does arise: if the thread holding the lock gets out 
> of the mutex quickly then the spinner can move in quickly.  After some 
> number of spins we generally need to inflate the lock to allocate a wait 
> queue (to avoiding hogging the processor).
> 
> Finally, the case where many threads are contending on the inflated lock 
> (with wait queue).  The only question now is when to deflate.  Our 
> current heuristic is to deflate when the last thread releases the lock 
> and notices that there are no other threads waiting.  This seems to work 
> well in practice, but of course there are pathological cases.

So does the implementation dynamically detect which case holds and
choose between the schemes?  What are the criteria?

> 
> Note that in no case have I mentioned the need for a pthread_mutex 
> (though pthread locks/conditions are used to manage threads that must 
> block on a Java quit queue).
> 
> We ought to be able to do much the same in Modula-3.
> 
> Antony Hosking | Associate Professor | Computer Science | Purdue University
> 305 N. University Street | West Lafayette | IN 47907 | USA
> Office +1 765 494 6001 | Mobile +1 765 427 5484
> 
>



More information about the M3devel mailing list