Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Обратимся к листингу 13.2. Библиотека
Mutexrequire 'thread.rb'@list = []@list[0]="shoes shipsnsealing-wax"@list[1]="cabbages kings"@list[2]="quarksnshipsncabbages"def hesitate sleep rand(0)end@hash = {}@mutex = Mutex.newdef process_list(listnum) lnum = 0 @list[listnum].each do |line| words = line.chomp.split words.each do |w| hesitate @mutex.lock if @hash[w] hesitate @hash[w] += ["#{listnum}:#{lnum}"] else hesitate @hash[w] = ["#{listnum}:#{lnum}"] end @mutex.unlock end lnum += 1 endendt1 = Thread.new(0) {|num| process_list(num) }t2 = Thread.new(1) {|num| process_list(num) }t3 = Thread.new(2) {|num| process_list(num) }t1.joint2.joint3.joincount = 0@hash.values.each {|v| count += v.size }puts "Всего слов: #{count} " # Всегда печатается 8!Отметим, что помимо метода
lockMutextry_locklockfalserequire 'thread'mutex = Mutex.newt1 = Thread.new { mutex.lock; sleep 30 }sleep 1t2 = Thread.new do if mutex.try_lock puts "Захватил" else puts "He сумел захватить" # Печатается немедленно. endendsleep 2Эта возможность полезна, если поток не хочет приостанавливать выполнение. Есть также метод
synchronizemutex = Mutex.newmutex.synchronize do # Любой код, нуждающийся в защите...endСуществует еще библиотека
mutex_mMutex_mrequire 'mutex_m'class MyClass include Mutex_m # Теперь любой объект класса MyClass может вызывать # методы lock, unlock, synchronize... # Внешние объекты также могут вызывать эти # методы для объекта MyClass.end13.2.3. Предопределенные классы синхронизированных очередей
В библиотеке
thread.rbQueueSizedQueueОба класса имеют практически один и тот же набор методов, поскольку
SizedQueueQueuebuff = SizedQueue.new(25)upper1 = buff.max #25# Увеличить размер очереди...buff.max = 50upper2 = buff.max # 50В листинге 13.3 приведено решение задачи о производителе и потребителе. Для производителя задержка (аргумент sleep) чуть больше, чем для потребителя, чтобы единицы продукции «накапливались».
require 'thread'buffer = SizedQueue.new(2)producer = Thread.new do
