[Ruby] Синхронизация
Kirill A. Shutemov
k.shutemov на sam-solutions.net
Чт Апр 27 13:18:20 MSD 2006
Понадобилось тут сделать что-то типа блокируемого ввода-вывода. Есть
массив в который один поток пишет, а другой из него читает. Причём читающий
поток блокируется до лучших времён, если массив пуст. Почесав репу и
самостоятельно ничего не придумав(опыта работы с трэдами мало), пошёл
гуглить, гле и нашёл примерчик с MonitorMixin(входит в stdlibs). Результат
решения этой задачки в аттаче. Надеюсь кому-нить пригодится.
--
Kirill A. Shutemov Belarus, Minsk
E-mail: k.shutemov (AT) sam-solutions.net
JID: kas (AT) altlinux.org
ICQ: 152302675
Fast ship? You mean you've never heard of the Millennium Falcon?
-- Han Solo
----------- УМЕДХЭБС ЮБУФШ -----------
require 'monitor'
class A
def initialize
@arr = []
@arr.extend(MonitorMixin)
@empty_cond = @arr.new_cond
end
def write(obj)
@arr.synchronize{
@arr << obj
@empty_cond.signal
}
end
def read
@arr.synchronize{
@empty_cond.wait_while{@arr.empty?}
@arr.shift
}
end
end
a = A.new
count = 0
t1 = Thread.new{0.upto(9999){|i| a.write(i)}}
t2 = Thread.new{0.upto(9999){|i| count+=1 if a.read}}
t1.join
t2.join
p count
----------- УМЕДХЭБС ЮБУФШ -----------
Было удалено вложение не в текстовом формате...
Имя : отсутствует
Тип : application/pgp-signature
Размер : 191 байтов
Описание: отсутствует
Url : http://lists.altlinux.org/pipermail/ruby/attachments/20060427/a4f3cc3e/attachment.bin
Подробная информация о списке рассылки Ruby