Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.9.2011
Репутация: нет Всего: нет
|
Здравствуйте! Я пытаюсь решить задачу на параллельные процессы, она звучит следующим образом: Цитата | Разработайте систему, управляющую пассажирским лифтом, с одной кнопкой вызова. Реализуйте схему работы лифта при перевозке пассажиров, если есть вызовы, то лифт останавливается при движении вниз.
|
Для написания кода я взял за основу модель "производитель-потребитель".Вышел следующий алгоритм, рабочий: Код | # To change this template, choose Tools | Templates # and open the template in the editor.
require 'semaphore' t0 = Time.now
max=5#грузоподъемность(максимальное количество людей в лифте) c = 10#колличество циклов
tp = []#индексы потребителя tc = []#индексы производителя
#параметры работы лифта ffrom=Array.new(max)#этаж, где нажата кнопка (0 - кнопка не была нажата) fto=Array.new(max)#этаж, запрошенный пассажиром лифта
prod_from=[]#этаж где был взят пассажир для первого процесса prod_to=[]#этаж который запросил пассажир для первого процесса cons_from=[]#этаж где был взят пассажир для второго процесса cons_to=[]#этаж который запросил пассажир для второго процесса
buf = Array.new(max)#буфер для информации о пассажирах s1 = Semaphore.new(buf.size)#защита от переполнения буфера s2 = Semaphore.new(0) m = Semaphore.new(1) first=true
producer = Thread.new do#процесс-производитель - вводит пассажиров i = 0 j=0 c.times do #sleep(rand(5)%5) good_pas=false m.P d = rand(8)+1 puts "вызов лифта на этаже #{d}" unless(first) unless(first)then if((d>fto[j])and(d<=ffrom[j]))then good_pas=true puts "пассажир будет взят по пути\n" else puts "пассажир не может быть взят по пути\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<<ffrom[i] prod_to<<fto[i] tp << d s1.P m.P unless(good_pas) puts "\nс #{ffrom[i]}-го этажа зашёл пассажир и запросил #{fto[i]}-й этаж" buf[i] = d m.V s2.V i = ( i + 1 ) % buf.size#когда i+1=buf.size,i присваивается 0 как при первой итерации end end
consumer = Thread.new do#процесс-потребитель - выводит пассажиров i = 0 c.times do s2.P m.P d = buf[i] puts "\nприбыл пассажир с #{ffrom[i]}-го на #{fto[i]}-й" cons_from<<ffrom[i] cons_to<<fto[i] m.V s1.V tc << d i = ( i + 1 ) % buf.size end end
producer.join consumer.join
puts "\nмассив этажей входа, с точки зрения производителя:\n\t["+prod_from.join(',')+"]" puts "массив этажей выхода, с точки зрения производителя:\n\t["+prod_to.join(',')+"]" puts "массив этажей входа, с точки зрения потребителя:\n\t["+cons_from.join(',')+"]" puts "массив этажей выхода, с точки зрения потребителя:\n\t["+cons_to.join(',')+"]"
puts "\n\nПроверка на равенство этажей входа: #{prod_from==cons_from}" puts "Проверка на равенство этажей выхода: #{prod_to==cons_to}" puts "Время выполнения: #{Time.now - t0}"
|
Но выходят очень странные данные. Получается, что пассажиры запрашивают лифт лишь когда лифт взял какого-либо пассажира и везёт его. Но нет ни одного пассажира (кроме первого) который запросил бы лифт, когда в лифте никого нет. Данные выходят такие: Цитата |
с 3-го этажа зашёл пассажир и запросил 4-й этаж вызов лифта на этаже 7 пассажир не может быть взят по пути
прибыл пассажир с 3-го на 4-й
с 7-го этажа зашёл пассажир и запросил 5-й этаж вызов лифта на этаже 3 пассажир не может быть взят по пути
прибыл пассажир с 7-го на 5-й
с 3-го этажа зашёл пассажир и запросил 8-й этаж вызов лифта на этаже 1 пассажир не может быть взят по пути
прибыл пассажир с 3-го на 8-й
с 1-го этажа зашёл пассажир и запросил 2-й этаж вызов лифта на этаже 7 пассажир не может быть взят по пути
прибыл пассажир с 1-го на 2-й
с 7-го этажа зашёл пассажир и запросил 6-й этаж вызов лифта на этаже 8 пассажир не может быть взят по пути
прибыл пассажир с 7-го на 6-й
с 8-го этажа зашёл пассажир и запросил 3-й этаж вызов лифта на этаже 2 пассажир не может быть взят по пути
прибыл пассажир с 8-го на 3-й
с 2-го этажа зашёл пассажир и запросил 8-й этаж вызов лифта на этаже 6 пассажир не может быть взят по пути
прибыл пассажир с 2-го на 8-й
с 6-го этажа зашёл пассажир и запросил 8-й этаж вызов лифта на этаже 1 пассажир не может быть взят по пути
прибыл пассажир с 6-го на 8-й
с 1-го этажа зашёл пассажир и запросил 7-й этаж вызов лифта на этаже 4 пассажир не может быть взят по пути
прибыл пассажир с 1-го на 7-й
с 4-го этажа зашёл пассажир и запросил 8-й этаж
прибыл пассажир с 4-го на 8-й
массив этажей входа, с точки зрения производителя: [3,7,3,1,7,8,2,6,1,4] массив этажей выхода, с точки зрения производителя: [4,5,8,2,6,3,8,8,7,8] массив этажей входа, с точки зрения потребителя: [3,7,3,1,7,8,2,6,1,4] массив этажей выхода, с точки зрения потребителя: [4,5,8,2,6,3,8,8,7,8]
Проверка на равенство этажей входа: true Проверка на равенство этажей выхода: true Время выполнения: 0.125002
|
Подскажите пожалуйста, есть ли способ решения этой проблемы? Это сообщение отредактировал(а) YaMolekula - 13.11.2011, 18:28
|