[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