下面的代码线程安全吗?我担心srand可能是一个不安全的变量。我有一个rails应用程序,并将使用5-10个线程的Puma。我不想引起问题。
class Test
def initialize(seed)
srand seed # => 1, 222, 222, 111
end # => :initialize
def letter
%w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample # => "g", "u"
end # => :letter
def letter1
%w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample # => "g", "u"
end # => :letter1
end # => :letter1
Test.new(222).letter # => "g"
Test.new(222).letter1 # => "g"
Test.new(111).letter # => "u"
Test.new(111).letter1 # => "u"发布于 2020-10-06 11:41:09
取决于你所说的“线程安全”是什么意思。但是,默认的随机数生成器是全局的,在线程之间共享;它将取决于线程时间,以查看哪个线程接收哪个随机数。如果您的目的是让所有线程都从一个RNG中获得随机数,那么您的代码就没问题--尽管结果可能是不可重复的,这可能会违背srand的目的。
如果您希望确保每个Test只独立(且可重复地)生成数字,则需要让每个Test都有自己的随机数生成器:
class Test
def initialize(seed)
@random = Random.new(seed)
end
def letter
%w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample(random: @random)
end
end
t1 = Test.new(111)
t2 = Test.new(222)
3.times.map { t1.letter }
# => ["u", "m", "u"]
3.times.map { t2.letter }
# => ["u", "m", "u"]https://stackoverflow.com/questions/64215612
复制相似问题