Книга: Программирование на языке Ruby
13.2.1. Синхронизация с помощью критических секций
13.2.1. Синхронизация с помощью критических секций
Простейший способ синхронизации дают критические секции. Когда поток входит в критическую секцию программы, гарантируется, что никакой другой поток не войдет в нее, пока первый не выйдет.
Если акцессору Thread.critical
присвоить значение true
, то выполнение других потоков не будет планироваться. В следующем примере мы переработали код предыдущего, воспользовавшись акцессором critical
для определения критической области, которая защищает уязвимые участки программы.
x = 0
t1 = Thread.new do
1.upto(1000) do
Thread.critical = true
x = x + 1
Thread.critical = false
end
end
t2 = Thread.new do
1.upto(1000) do
Thread.critical = true
x = x + 1
Thread.critical = false
end
end
t1.join
t2.join
puts x
Теперь последовательность выполнения изменилась; взгляните, в каком порядке работают потоки t1
и t2
. (Конечно, вне того участка, где происходит увеличение переменной, потоки могут чередоваться более-менее случайным образом.)
t1 t2
----------------------------- -----------------------------
Прочитать значение x (123)
Увеличить значение на 1 (124)
Записать результат в x
Прочитать значение x (124)
Увеличить значение на 1 (125)
Записать результат в x
Возможны такие комбинации операций с потоками, при которых поток планируется даже тогда, когда какой-то другой поток находится в критической секции.
Простейший случай — вновь созданный поток начинает исполнение немедленно вне зависимости от того, занимает какой-то другой поток критическую секцию или нет. Поэтому описанную технику лучше применять только в самых простых ситуациях.
- 13.2.1. Синхронизация с помощью критических секций
- 13.2.2. Синхронизация доступа к ресурсам (mutex.rb)
- 13.2.3. Предопределенные классы синхронизированных очередей
- 13.2.4. Условные переменные
- 13.2.5. Другие способы синхронизации
- 13.2.6. Тайм-аут при выполнении операций
- 13.2.7. Ожидание события
- 13.2.8. Продолжение обработки во время ввода/вывода
- 13.2.9. Реализация параллельных итераторов
- 13.2.10. Параллельное рекурсивное удаление
- Синхронизация и директива critical
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Организация пользователей в группы с помощью ролей
- ЧАСТЬ 3 СИНХРОНИЗАЦИЯ
- Обработка запросов с помощью PHP
- Как с помощью компьютера подшутить над друзьями и коллегами?
- Как составить психологический портрет с помощью Сети?
- Хочу следить за «здоровьем» винчестера. С помощью какой программы это можно делать?
- Как открыть каталог с помощью командной строки?
- Как заблокировать компьютер с помощью командной строки?
- С помощью какой программы можно открыть файл в формате DjVu?