rubyスレッド操作(続き)同期スレッド

1054 ワード

rubyでは同期を実現する3つの方法を提供し,それぞれ同期を担当するMutexクラスのみの方法,データの受け渡しを兼ねたQueueメソッド,ConditionVariableクラスを用いて同期を実現する.
@num=200
@mutex=Mutex.new
def ticketNum(num)
	@mutex.lock
	Thread.pass
	if (@num>=num)
		@num=@num-num
		puts"       #{num}    "
	else
		puts"   ,    #{num}      ,     "
	end
	@mutex.unlock
end
ticketsuccess=Thread.new(2){|num| ticketNum(num)}
ticketsuccess1=Thread.new(199){|num| ticketNum(num)}
ticketsuccess.join
ticketsuccess.join

実行結果
       199    
   ,    2      ,     
はtry_を使用することもできます.lockとsynchronizeはスレッドをロックし、try_を使用します.lockの場合、別のリソースがロックされている場合、synchronizeを使用してfalseに戻ります.
@num=200
@mutex=Mutex.new
def ticketNum(num)
	@mutex.synchronize do
	Thread.pass
	if (@num>=num)
		@num=@num-num
		puts"       #{num}    "
	else
		puts"   ,    #{num}      ,     "
	end
	end
end
ticketsuccess=Thread.new(2){|num| ticketNum(num)}
ticketsuccess1=Thread.new(199){|num| ticketNum(num)}
ticketsuccess.join
ticketsuccess.join

実行結果は上と同じです