我正在试验多线程示例。我尝试使用以下代码产生竞争条件。但我总是得到相同的(正确的)输出。类 Counter attr_reader:...
我正在试验多线程示例。我尝试使用以下代码产生竞争条件。但我总是得到相同(正确)的输出。
class Counter
attr_reader :count
def initialize
@count = 0
end
def increment
@count += 1
end
def decrement
@count -= 1
end
end
c = Counter.new
t1 = Thread.start { 100_0000.times { c.increment } }
t2 = Thread.start { 100_0000.times { c.increment } }
t1.join
t2.join
p c.count #200_0000
我能够使用每个线程中更少的迭代次数来观察 Java 中的竞争条件。是不是因为我运行的次数不够多而导致竞争条件产生,还是 +
-
中的线程是安全的?我使用的是 ruby 2.0.0p247
我也在尝试理解这一点,但在这段代码(从上面复制)中,c.count 得到了不同的结果。例如,我得到 c.coint = 1,573,313 或 1,493,791 等。查看代码,似乎 c.count 每次都应该是 2,000,000!
class Counter
attr_accessor :count, :tmp
def initialize
@count = 0
@tmp = 0
end
def increment
@count += 1
end
end
c = Counter.new
t1 = Thread.start { 1_000_000.times { c.increment; c.tmp += 1 if c.count.even?; } }
t2 = Thread.start { 1_000_000.times { c.increment; c.tmp += 1 if c.count.even?; } }
t1.join
t2.join
p c.count # Varies e.g. 1,573,313 or 1,493,791 etc
p c.tmp # Also varies: 882,928 etc.