[Edu-sig] Properties use case

David Reed dreedmac at columbus.rr.com
Sat Mar 25 15:10:22 CET 2006


On Mar 25, 2006, at 8:33 AM, Arthur wrote:

>
>
>>> -----Original Message-----
>>> From: Laura Creighton [mailto:lac at strakt.com]
>>> Sent: Saturday, March 25, 2006 7:16 AM
>>> To: Arthur
>
>>> Ok, so it does matter.  Are you locking your complex number
>>> before modifying it?
>
> Just to generalize the issue, so that I know, realy, what we are  
> talking
> about, can we discuss my circle instead of my complex object.
>
> It has a center, a radius, and a matrix describing its orientation  
> in space.
> I would like all to be in sync and recalculated, based on changes  
> to the
> position of any other objects on which its center, its radius, or its
> orientation in space is dependent, *before* it redraws itself.
>
> No I do not lock my circle.
>
> Art


I think you are saying you don't quite understand when locks are  
needed. My apologies if this is not  what you are saying, but here is  
a short explanation of when locks are needed.

Whenever you have multiple threads that are using the same data  
structure you need a lock to ensure that only one thread is accessing  
it at a time. This is not an issue if none of the threads are  
modifying the object (which is the case with immutable objects since  
they cannot be modified). If at least one thread is modifying the  
object you need a lock around every access of the object otherwise  
you could have one thread start updating the object, be interrupted  
by the scheduler and another thread could then access the object that  
is now in an inconsistent state because the modification by the other  
thread had not completed.

Consider two different threads both executing the code (with the same  
variables):
y = x
y = y + 1
x = y

If one thread executes y = x and then is interrupted by the  
scheduler, and the other thread now executes all three statements,  
and then the first thread completes the final two statements, x is  
now just one more than it was before, even though both threads added  
one to it (i.e., it should be two more than it was).

The solution to this each thread does:
lock.acquire()
y = x
y = y + 1
x = y
lock.release()

This will not allow the second thread to start the code if the first  
thread has started it but not yet finished it.

Again with immutable objects, this is not an issue. Also, as I  
understand it, Python's Queue class in the Queue module is thread  
safe (i.e., it essentially takes care of the locking for you).

HTH,
Dave



More information about the Edu-sig mailing list