Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

sleep rand(0)

puts "#{n}: (...играет...)"

sleep rand(0)

puts "#{n}: Я закончил."

@music.synchronize do

@violins_free += 1

@violin.signal if @violins_free == 1

@bows_free += 1

@bow.signal if @bows_free == 1

end

 end

end

threads = []

3.times {|i| threads << Thread.new { musician(i) } }

threads.each {|t| t.join }

Мы полагаем, что это решение никогда не приводит к тупиковой ситуации, хотя доказать этого не сумели. Но интересно отметить, что описанный алгоритм не справедливый. В наших тестах оказалось, что первый скрипач играет чаще двух остальных, а второй чаще третьего. Выяснение причин такого поведения и его исправление мы оставляем читателю в качестве интересного упражнения.

13.2.5. Другие способы синхронизации

Еще один механизм синхронизации - это монитор, который в Ruby реализован в библиотеке

monitor.rb
. Это более развитый по сравнению с мьютексом механизм, основное отличие состоит в том, что захваты одного и того же мьютекса не могут быть вложенными, а монитора — могут.

Тривиальный случай возникновения такой ситуации вряд ли возможен. В самом деле, кто станет писать такой код:

@mutex = Mutex.new

@mutex.synchronize do

 @mutex.synchronize do

#...

 end

end

Но нечто подобное может произойти в сложной программе (или при рекурсивном вызове метода). Какова бы ни была причина, последствием будет тупиковая ситуация. Уход от нее — одно из достоинств модуля-примеси

Monitor
.

@mutex = Mutex.new

def some_method

 @mutex.synchronize do

#...

some_other_method # Тупиковая ситуация!

 end

end

def some_other_method

 @mutex.synchronize do

#...

 end

end

Модуль-примесь

Monitor
обычно применяется для расширения объекта. Для создания условной переменной предназначен метод
new_cond
.

Класс

ConditionVariable
в библиотеке
monitor.rb
дополнен по сравнению с определением в библиотеке
thread
. У него есть методы
wait_until
и
wait_while
, которые блокируют поток в ожидании выполнения условия. Кроме того, возможен тайм-аут при ожидании, поскольку у метода
wait
имеется параметр
timeout
, равный количеству секунд (по умолчанию
nil
).

Поскольку примеры работы с потоками у нас кончаются, то в листинге 13.5 мы предлагаем реализацию классов

Queue
и
SizedQueue
с помощью монитора. Код приводится с разрешения автора, Шуго Маэда (Shugo Maeda).

Листинг 13.5. Реализация класса Queue с помощью монитора

# Автор: Shugo Maeda

require 'monitor'

class Queue

 def initialize

@que = []

@monitor = Monitor.new

@empty_cond = @monitor.new_cond

 end

 def enq(obj)

@monitor.synchronize do

@que.push(obj)

@empty_cond.signal

end

 end

 def deq

@monitor.synchronize do

while @que.empty?

@empty_cond.wait

end

return @que.shift

end

 end

end

class SizedQueue < Queue

 attr :max

 def initialize(max)

super

@max = max

@full_cond = @monitor.new_cond

 end

 def enq(obj)

@monitor.synchronize do

while @que.length >= @max

@full_cond.wait

end

super(obj)

end

 end

 def deq

@monitor.synchronize do

obj = super

if @que.length < @max

@full_cond.signal

end

return obj

end

 end

 def max=(max)

@monitor.synchronize do

@max = max

Поделиться:
Популярные книги

Император

Эберс Георг Мориц
Проза:
историческая проза
5.00
рейтинг книги
Император

Пиччинино

Санд Жорж
Приключения:
исторические приключения
6.25
рейтинг книги
Пиччинино

Отряд

Посняков Андрей
Отряд тайных дел
Фантастика:
фэнтези
боевая фантастика
6.25
рейтинг книги
Отряд

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
6.25
рейтинг книги
Газлайтер. Том 31

Язык программирования Си. Издание 3-е, исправленное

Ритчи Деннис М.
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
Язык программирования Си. Издание 3-е, исправленное

Собрание сочинений

Гримм Якоб и Вильгельм
Детские:
прочая детская литература
5.00
рейтинг книги
Собрание сочинений

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 10

Барон Бранд Берс. Том 2

Limonad
2. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 2

Газлайтер. Том 8

Володин Григорий Григорьевич
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Великое испытание

Imperew
2. Ютрейн
Фантастика:
фэнтези
ненаучная фантастика
рпг
5.00
рейтинг книги
Великое испытание

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Эрсус. Инферно

Павлов Вел
3. Стезя Эрсуса
Фантастика:
фэнтези
5.00
рейтинг книги
Эрсус. Инферно

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Упадок и разрушение Британской империи 1781-1997

Брендон Пирс
Научно-образовательная:
история
4.00
рейтинг книги
Упадок и разрушение Британской империи 1781-1997