Книга: Программирование на языке 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.
- Достоинства и недостатки потоков
- Создание потока
- Создание процесса
- Создание переносимых приложений с использованием потоков Pthreads
- 13.1. Создание потоков и манипулирование ими
- 26.2. Основные функции для работы с потоками: создание и завершение потоков
- Листинг 4.2. (thread-create2.c) Создание двух потоков
- Программное создание вторичных потоков
- Определение контекстно-связанных объектов
- Точка входа в программу
- База данных диспетчера ядра
- Программа