Multithreading and locking
Duncan Booth
duncan at NOSPAMrcp.co.uk
Thu Sep 18 06:36:01 EDT 2003
"Ivan Voras" <ivoras at fer.hr> wrote in news:bkbv5l$kgl$1 at bagan.srce.hr:
>
> Is it true what I heard (as a "rumour" of sorts), that in multithreaded
> Python programs global variables are already automagically protected by
> mutexes? Can someone clarify on that?
>
The Python interpreter holds a global mutex which is released by some
methods that call the OS, and is also released sometimes between bytecode
instructions.
The effect of this is that any operation that takes a single bytecode
instruction, and which does not call the OS, cannot be interrupted by
another Python thread. It is left to the user to work out when this means a
multithreaded operation will be safe.
For example:
x.extend(y)
If x is a list, then this is safe in a multithreaded environment. If x is a
user defined class and the extend method is coded in Python, then this
probably isn't safe.
x += y
If x and y are lists, this appears superficially to be the same as the
first example, however this code compiles to two bytecode instructions (an
inplace add and a store), so it could be interrupted with unfortunate
consequences.
The bottom line is that with care you can use a list for multi-threaded
queue operations, but with a Queue class already there and waiting it isn't
usually worth the risk.
--
Duncan Booth duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
More information about the Python-list
mailing list