diff options
author | Guido van Rossum <guido@python.org> | 1998-05-29 17:51:31 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-05-29 17:51:31 (GMT) |
commit | d03e1197cb5052e3f758794e2a7aecf9f5ca5f46 (patch) | |
tree | b75a6ed60d4dde281e1d8fa40d4eccf0f044c312 | |
parent | b39e461b89a587116b56f57a5e34ebb479466dd8 (diff) | |
download | cpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.zip cpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.tar.gz cpython-d03e1197cb5052e3f758794e2a7aecf9f5ca5f46.tar.bz2 |
Make gauss() semi-thread-safe. It can still give duplicate results,
but it can no longer raise an exception when called by several threads
simultaneously.
-rw-r--r-- | Lib/random.py | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/Lib/random.py b/Lib/random.py index d95c324..a19059c 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -15,6 +15,10 @@ # 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 |