mirror of https://github.com/python/cpython.git
Add comments explaining thread unsafety of this code.
This commit is contained in:
parent
d03e1197cb
commit
cc20b76ad0
|
@ -29,6 +29,13 @@
|
||||||
# Adrian Baddeley.
|
# Adrian Baddeley.
|
||||||
|
|
||||||
|
|
||||||
|
# Multi-threading note: the random number generator used here is not
|
||||||
|
# thread-safe; it is possible that nearly simultaneous calls in
|
||||||
|
# different theads return the same random value. 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.)
|
||||||
|
|
||||||
|
|
||||||
class whrandom:
|
class whrandom:
|
||||||
#
|
#
|
||||||
# Initialize an instance.
|
# Initialize an instance.
|
||||||
|
@ -60,6 +67,8 @@ def seed(self, x = 0, y = 0, z = 0):
|
||||||
# Get the next random number in the range [0.0, 1.0).
|
# Get the next random number in the range [0.0, 1.0).
|
||||||
#
|
#
|
||||||
def random(self):
|
def random(self):
|
||||||
|
# This part is thread-unsafe:
|
||||||
|
# BEGIN CRITICAL SECTION
|
||||||
x, y, z = self._seed
|
x, y, z = self._seed
|
||||||
#
|
#
|
||||||
x = (171 * x) % 30269
|
x = (171 * x) % 30269
|
||||||
|
@ -67,6 +76,7 @@ def random(self):
|
||||||
z = (170 * z) % 30323
|
z = (170 * z) % 30323
|
||||||
#
|
#
|
||||||
self._seed = x, y, z
|
self._seed = x, y, z
|
||||||
|
# END CRITICAL SECTION
|
||||||
#
|
#
|
||||||
return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
|
return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue