Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
endВозвращаемое значение — объект типа
ThreadА если нужно передать потоку параметры? Достаточно передать их методу
Thread.newa = 4b = 5с = 6thread2 = Thread.new(а,b,с) do |a, x, y| # Манипуляции с a, x и y.end# Если переменная а будет изменена новым потоком,# то главный поток не получит об этом никакого уведомления.Параметры блока, являющиеся ссылками на существующие переменные, практически неотличимы от самих переменных. Поэтому, например, переменная
аПоток может также обращаться к переменным из той же области видимости, в которой был создан. Ясно, что без синхронизации это может стать источником проблем. Главный и любой другой поток могут изменять такую переменную независимо друг от друга, и результаты подобных действий непредсказуемы.
x = 1y = 2thread3 = Thread.new do # Этот поток может манипулировать переменными x and y # из внешней области видимости, но это не всегда безопасно. sleep(rand(0)) # Спать в течение случайно выбранного времени # (меньше секунды). x = 3endsleep(rand(0))puts x# Если запустить эту программу несколько раз подряд, то может быть# напечатано как 1, так и 3!У метода
newfork13.1.2. Доступ к локальным переменным потока
Мы знаем об опасности доступа из потока к переменным, определенным вне его области видимости, но мы также знаем, что у потока могут быть локальные данные. А что делать, если поток хочет «обнародовать» часть принадлежащих ему данных?
Для этой цели предусмотрен специальный механизм. Если объект
ThreadСуществует также метод
key?Внутри потока к таким данным тоже следует обращаться, как к хэшу. Метод
Thread.currentthread = Thread.new dot = Thread.currentt[:var1] = "Это строка"t[:var2] = 365end# Доступ к локальным данным потока извне...x = thread[:var1] # "Это строка"y = thread[:var2] # 365has_var2 = thread.key?("var2") # truehas_var3 = thread.key?("var3") # falseОтметим, что эти данные доступны другим потокам даже после того, их владелец завершил работу (как в данном случае).
Помимо символа (см. выше), для идентификации локальной переменной потока можно употреблять и строки.
thread = Thread.new dot = Thread.currentt["var3"] = 25t[:var4] = "foobar"enda = thread[:var3] = 25b = thread["var4"] = "foobar"He путайте эти специальные имена с настоящими локальными переменными. В следующем фрагменте разница видна более отчетливо:
thread = Thread.new do t = Thread.current t["var3"] = 25 t[:var4] = "foobar" var3 = 99 # Настоящие локальные переменные var4 = "zorch" # (извне недоступны)enda = thread[:var3] # 25b = thread["var4"] # "foobar"И еще отметим, что ссылку на объект (на настоящую локальную переменную) внутри потока можно использовать для сокращенной записи. Это справедливо, если вы сохраняете одну и ту же ссылку, а не создаете новую.
thread = Thread.new do t = Thread.current x = "nXxeQPdMdxiBAxh" t[:my_message] = x x.reverse! x.delete! "x" x.gsub!(/[A-Z]/,"") # С другой стороны, присваивание создает новый объект, # поэтому "сокращение" становится бесполезным...endа = thread[:my_message] # "hidden"Ясно, что сокращение не будет работать и в том случае, когда вы имеете дело с объектами наподобие
Fixnum13.1.3. Опрос и изменение состояния потока
В классе
Threadlistmaincurrent
