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

13.1.1. Создание потоков

13.1.1. Создание потоков

Создать поток просто: достаточно вызвать метод new и присоединить блок, который будет исполняться в потоке.

thread = Thread.new do
 # Предложения, исполняемые в потоке...
end

Возвращаемое значение — объект типа Thread. Главный поток программы может использовать его для управления вновь созданным потоком.

А если нужно передать потоку параметры? Достаточно передать их методу Thread.new, который, в свою очередь, передаст их блоку.

a = 4
b = 5
с = 6
thread2 = Thread.new(а,b,с) do |a, x, y|
 # Манипуляции с a, x и y.
end
# Если переменная а будет изменена новым потоком,
# то главный поток не получит об этом никакого уведомления.

Параметры блока, являющиеся ссылками на существующие переменные, практически неотличимы от самих переменных. Поэтому, например, переменная а в каком-то смысле «опасна», что и отражено в комментарии.

Поток может также обращаться к переменным из той же области видимости, в которой был создан. Ясно, что без синхронизации это может стать источником проблем. Главный и любой другой поток могут изменять такую переменную независимо друг от друга, и результаты подобных действий непредсказуемы.

x = 1
y = 2
thread3 = Thread.new do
 # Этот поток может манипулировать переменными x and y
 # из внешней области видимости, но это не всегда безопасно.
 sleep(rand(0)) # Спать в течение случайно выбранного времени
 # (меньше секунды).
 x = 3
end
sleep(rand(0))
puts x
# Если запустить эту программу несколько раз подряд, то может быть
# напечатано как 1, так и 3!

У метода new есть синоним fork — это имя выбрано по аналогии с хорошо известным системным вызовом в UNIX.

Оглавление книги


Генерация: 0.578. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз