]> granicus.if.org Git - python/commitdiff
Make gauss() semi-thread-safe. It can still give duplicate results,
authorGuido van Rossum <guido@python.org>
Fri, 29 May 1998 17:51:31 +0000 (17:51 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 29 May 1998 17:51:31 +0000 (17:51 +0000)
but it can no longer raise an exception when called by several threads
simultaneously.

Lib/random.py

index d95c324061714eb0a538b73297c3f52f3569f6d5..a19059cbe8d202ad792e3f4e6aa8b25bd93089a4 100644 (file)
 
 # Translated from anonymously contributed C/C++ source.
 
+# Multi-threading note: the random number generator used here is not
+# thread-safe; it is possible that two calls return the same random
+# value.  See whrandom.py for more info.
+
 import whrandom
 from whrandom import random, uniform, randint, choice # Also for export!
 from math import log, exp, pi, e, sqrt, acos, cos, sin
@@ -243,12 +247,18 @@ def gauss(mu, sigma):
        # (Lambert Meertens)
        # (corrected version; bug discovered by Mike Miller, fixed by LM)
 
+       # Multithreading note: When two threads call this function
+       # simultaneously, it is possible that they will receive the
+       # same return value.  The window is very small though.  To
+       # avoid this, you have to use a lock around all calls.  (I
+       # didn't want to slow this down in the serial case by using a
+       # lock here.)
+
        global gauss_next
 
-       if gauss_next != None:
-               z = gauss_next
-               gauss_next = None
-       else:
+       z = gauss_next
+       gauss_next = None
+       if z is None:
                x2pi = random() * TWOPI
                g2rad = sqrt(-2.0 * log(1.0 - random()))
                z = cos(x2pi) * g2rad