Python threading (was: Re: global interpreter lock not working as it should)

Armin Steinhoff a-steinhoff at web.de
Mon Aug 5 05:12:20 EDT 2002


martin at v.loewis.de (Martin v. Loewis) wrote in message news:<m3u1maavgh.fsf at mira.informatik.hu-berlin.de>...
> bokr at oz.net (Bengt Richter) writes:
> 
> > >> A mutex should result in a context switch every time there is a
> > >> release with a waiter present, since the releaser would reliably
> > >> fail to re-acquire.  Perhaps that is the way it works on BSD?
> > >> That might at least partly explain Jonathan's results.
>  
> > >I doubt that. 
> > Why?
> 
> Because the other threads waiting for the GIL do not block on a
> mutex. So mutex wait lists should not be relevant for this behaviour.
> 
> > IOW, I don't think the new owner has to execute before it becomes owner
> > of the mutex, I think the OS hands it over as part of the release operation
> > if there is a waiter. Why would it be done otherwise?
> 
> Because of this code in thread_pthread.h
> 
> 	status = pthread_mutex_lock( &thelock->mut );

this starts a critical section for the handling of 'thelock->locked'
It will (must) block other threads which are trying to update
'thelock->locked'

> 	CHECK_STATUS("pthread_mutex_lock[1]");
> 	success = thelock->locked == 0;
> 	if (success) thelock->locked = 1;

'success' will always be 0 ... so why 'if(success)' ??????
We are in a critical section !!!

> 	status = pthread_mutex_unlock( &thelock->mut );
> 	CHECK_STATUS("pthread_mutex_unlock[1]");
> 
> 	if ( !success && waitflag ) {

The variable 'success' is meaningless ... who sets the waitflag ??

> 		/* continue trying until we get the lock */
                   ????????
> 
> 		/* mut must be locked by me -- part of the condition
> 		 * protocol */
> 		status = pthread_mutex_lock( &thelock->mut );
> 		CHECK_STATUS("pthread_mutex_lock[2]");

There is nothing to check ... you own now simply the mutex here.

The while loop is plain nonsens and dangerous because 'thelock->mut'
isn't acquired again!!

> 		while ( thelock->locked ) {
> 			status = pthread_cond_wait(&thelock->lock_released,
> 						   &thelock->mut);
> 			CHECK_STATUS("pthread_cond_wait");

After calling pthread_cond_wait() the mutex 'thelock->mut' will be
released!

The mutex 'thelock->mut' is only used to build a critical section
around the condition variable 'thelock->lock_released'

Who does pthread_cond_signal() and when ???

> 		}

'thelock->mut is now locked again ...

> 		thelock->locked = 1;

That's really corious ... 

> 		status = pthread_mutex_unlock( &thelock->mut );
> 		CHECK_STATUS("pthread_mutex_unlock[2]");


> 		success = 1;
> 	}
> 
> Nobody is blocking on the mutex;

Sorry ... that's not true! Please read the semantic of
pthread_mutex_lock.

This code looks like a MEDIUM chaos for me ... 

It should  be possible to implement the GIL by a single condition
variable!


Armin


> the other thread blocks on the
> condition variable instead. The first thread signals the condition
> variable, then tries to lock the mutex. If that succeeds, it will
> reacquire the lock. The other thread will come out of the cond_wait,
> and find that the lock is still locked. It then will wait on the
> condition variable again (probably adding itself to the end of the
> condition's wait list).
> 
> > OTOH, if there is a variable associated with the mutex that is
> > supposed to represent some state of the interpreter, and other
> > threads are reading this without synchronizing, then I can see a
> > possible (different) race.
> 
> The ->locked field of the lock is protected by a mutex, so there is no
> danger of it getting inconsistent - it is just not clear who will lock
> it.
> 
> > If a race condition is possible, I think the OS mutex implementation
> > is not good or more likely there's a bug in its use and/or simulation.
> 
> The OS mutex implementation is not (directly) used. Only the cond_wait
> implementation (indirectly) tries to acquire the mutex.
> 
> > Because mutex is not used after 2.2? But I thought 2.2 was the
> > 'business' edition.  If there's a race condition there, should it
> > not be looked into and fixed?
> 
> There is no bug in the sense that inconsistency could occur. There is
> just no guarantee that locks are fair in Python.
> 
> Regards,
> Martin



More information about the Python-list mailing list