From: "Luca (Email)" Date: 2011-12-29T15:52:44+09:00 Subject: I: model "lift-passengers" and concurrent programming -----Messaggio originale----- Da: Roman Faceless [mailto:ya1krabe@gmail.com] Inviato: domenica 13 novembre 2011 20:51 A: ruby-talk ML Oggetto: model "lift-passengers" and concurrent programming Hi, I'm trying to write a model of an elevator with one button. Elevator can take passengers along the way when going down. But in my code some error. Because passengers press a button only when the elevator carries passengers. And no passengers push the button when the elevator is free. I took a producer-consumer model. require 'semaphore' t0 = Time.now max=5#the maximum number of passengers c = 10#number of iterations tp = []#producer tc = []#consumer ffrom=Array.new(max)#floor, where the button is pressed fto=Array.new(max)#floor, which requires the passenger prod_from=[]#producer: floor where the passenger has been taken prod_to=[]#producer:floor where the passenger has arrived cons_from=[]#consumer: floor where the passenger has been taken cons_to=[]#floor where the passenger has arrived buf = Array.new(max)#buffer of lift s1 = Semaphore.new(buf.size)#overflow protection s2 = Semaphore.new(0) m = Semaphore.new(1) first=true producer = Thread.new do#producer i = 0 j=0 c.times do #sleep(rand(5)%5) good_pas=false m.P d = rand(8)+1 puts "button is pressed on the #{d}th floor" unless(first) unless(first)then if((d>fto[j])and(d<=ffrom[j]))then good_pas=true puts "passenger can be allowed\n" else puts "passenger can't be allowed\n" end end j = ( j + 1 ) % buf.size unless(first) m.V unless(good_pas) ffrom[i]=d fto[i]=rand(8)+1; first=false while(fto[i]==ffrom[i])do fto[i]=rand(8)+1; end prod_from<