同じランダムシードが与えられた場合、同じ結果を必要とするアプリケーションがあります。しかし、random.randint はスレッドセーフではありません。ミューテックスを試しましたが、うまくいきません。これが私の実験コードです(長くても簡単です):
import threading
import random
def child(n, a):
g_mutex = threading.Lock()
g_mutex.acquire()
random.seed(n)
for i in xrange(100):
a.append(random.randint(0, 1000))
g_mutex.release()
def main():
a = []
b = []
c1 = threading.Thread(target = child, args = (10, a))
c2 = threading.Thread(target = child, args = (20, b))
c1.start()
c2.start()
c1.join()
c2.join()
c = []
d = []
c1 = threading.Thread(target = child, args = (10, c))
c2 = threading.Thread(target = child, args = (20, d))
c1.start()
c1.join()
c2.start()
c2.join()
print a == c, b == d
if __name__ == "__main__":
main()
true, trueを出力するようにコーディングしたいのですが、 false, falseを与える可能性があります。スレッドセーフな randint を作成するにはどうすればよいですか?