1
有人可以給出一個具體的例子來演示非線程安全嗎? (以類似的方式,以一個運作版本礦下面如果可能的)Ruby請給出一個簡單的非線程安全示例
我需要演示非線程安全操作,使得我可以斷言上的失敗,並且然後執行互斥鎖,使得一個示例類我可以測試我的代碼是線程安全的。
我已經嘗試了以下但沒有成功,因爲線程似乎並行運行。假設紅寶石+ =操作者不是線程,該測試總是通過時,它不應:
class TestLock
attr_reader :sequence
def initialize
@sequence = 0
end
def increment
@sequence += 1
end
end
#RSpec test
it 'does not allow parallel calls to increment' do
test_lock = TestLock.new
threads = []
list1 = []
list2 = []
start_time = Time.now + 2
threads << Thread.new do
loop do
if Time.now > start_time
5000.times { list1 << test_lock.increment }
break
end
end
end
threads << Thread.new do
loop do
if Time.now > start_time
5000.times { list2 << test_lock.increment }
break
end
end
end
threads.each(&:join) # wait for all threads to finish
expect(list1 & list2).to eq([])
end
線程是非確定性的。這就是他們如此醜陋的原因。你不能讓他們確定性地失敗。即使您的鎖定不正確,他們有時也會工作,無論如何。你用你的代碼完美地演示了它,它適用於YARV,在JRuby和Rubinius上失敗。 –