Глава 13. Потоки в Ruby

Глава 13. Потоки в Ruby

Он тянет нить своего красноречия искуснее, чем развивает свои доводы.

Шекспир, «Бесплодные усилия любви», акт V, сцена 1[15]

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

В Ruby потоки определены на пользовательском уровне и не зависят от операционной системы. Они работают в DOS так же, как и в UNIX. Но, конечно, это снижает производительность, а на сколько именно, зависит от операционной системы.

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

С другой стороны, у потоков есть и недостатки. Всегда надо взвешивать, оправданно ли их применение в конкретном случае. К тому же, иногда доступ к ресурсу принципиально должен осуществляться строго последовательно, поэтому потоки не дадут никакого выигрыша. И, наконец, бывает так, что накладные расходы на синхронизацию доступа к глобальным ресурсам превышают экономию, достигаемую за счет использования нескольких потоков.

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

Проблемы, связанные с несинхронизированными потоками, хорошо известны. При одновременном доступе к глобальным данным со стороны нескольких потоков данные могут быть запорчены. Если один поток делает какое-то допущение о том, что успел выполнить другой поток, возможна гонка (race condition); обычно это приводит к «недетерминированному» коду, который дает разные результаты при каждом запуске. Наконец, существует опасность тупиковой ситуации, когда ни один поток не может продолжить выполнение, поскольку ожидает ресурс, занятый другим потоком. Код, написанный так, что ни одна из этих проблем не возникает, называется безопасным относительно потоков.

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Глава 8 Потоки

Из книги C++ автора Хилл Мюррей

Глава 8 Потоки ``bad input char: .Ppm(*=P!..*@Z9A*)5!!!!!"syui!!!"!Mp#V6P?p8`;!4lf amp; сообщение об ошибке (сокращенное) Язык С++ не обеспечивает средств для ввода/вывода. Ему это и не нужно. Такие средства легко и элегантно можно содать с помощью самого языка. Описанная здесь стандартная билиотека


ГЛАВА 7 Потоки и планирование выполнения

Из книги Системное программирование в среде Windows автора Харт Джонсон М

ГЛАВА 7 Потоки и планирование выполнения Основной единицей выполнения в Windows является поток, и одновременно несколько потоков могут выполняться в рамках одного процесса, разделяя его адресное пространство и другие ресурсы. В главе 6 процессы ограничивались только одним


Глава 1. Обзор Ruby

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Глава 1. Обзор Ruby Язык формирует способ нашего мышления и определяет то, о чем мы можем размышлять. Бенджамин Ди Уорф Стоит напомнить, что в новом языке программирования иногда видят панацею, особенно его адепты. Но ни один язык не сможет заменить все остальные. Не


Глава 4. Интернационализация в Ruby

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Глава 4. Интернационализация в Ruby Посему дано ему имя: Вавилон, ибо там смешал Господь язык всей земли, и оттуда рассеял их Господь по всей земле. Бытие, 11:9 Мы уже говорили, что тип символа, наверное, самый важный из всех. Но что такое символьные данные? Какие символы? Из


Глава 11. ООП и динамические механизмы в Ruby

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Глава 11. ООП и динамические механизмы в Ruby Как введение иррациональных чисел… стало удобным мифом упростившим законы арифметики… так физические объекты и постулированные сущности делают наше восприятие реальности более простым и завершенным… Концептуальная схема


Глава 12. Графические интерфейсы для Ruby

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Глава 12. Графические интерфейсы для Ruby Нет ничего хуже четкого образа нечеткой идеи. Апсель Адамс Нет смысла отрицать, что мы живем в век графических интерфейсов (ГИ). В обозримом будущем тот или иной вид графического интерфейса станет основным способом взаимодействия с


Глава 15. Ruby и форматы данных

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Глава 15. Ruby и форматы данных — Ваша информация, сэр, — говорит Библиотекарь. — Сможешь увязать эту информацию с утилитой «ВЫ ЗДЕСЬ»? — говорит Хиро. — Я посмотрю, что можно сделать, сэр. Форматы представляются совместимыми. Нил Стивенсон, «Лавина» В этой главе мы


Глава 19. Ruby и Web-приложения

Из книги автора

Глава 19. Ruby и Web-приложения Как ловко мы сплетаем сеть… Сэр Вальтер Скотт, «Мармион» Ruby — универсальный язык, его ни в коей мере нельзя считать исключительно «языком Web». Но, несмотря на это, одно из наиболее типичных его применений — создание приложений (да и вообще


Глава 20. Распределенный Ruby

Из книги автора

Глава 20. Распределенный Ruby Меньше — это больше. Робер Браунинг, «Андреа дель Сарто» В настоящее время имеется немало технологий, поддерживающих распределенную обработку: различные варианты RPC, а также COM, CORBA, DCE и Java RMI.Одни проще, другие сложнее, но в принципе все делают


Глава 21. Инструменты разработки для Ruby

Из книги автора

Глава 21. Инструменты разработки для Ruby Человек — это животное, создающее инструменты. Бенджамин Франклин Среда разработки включает не только интерпретатор. У каждого хорошего разработчика под рукой всегда есть целый набор средств, облегчающих жизнь. Некоторые из них


Глава 22. Сообщество пользователей Ruby

Из книги автора

Глава 22. Сообщество пользователей Ruby …Тот, кто не способен вступить в общение или, считая себя существом самодовлеющим, не чувствует потребности ни в чем, уже не составляет элемента государства, становясь либо животным, либо божеством. Аристотель, «Политика»[19] Уже было


Глава 10 Потоки и файлы

Из книги автора

Глава 10 Потоки и файлы 10.0. Введение Потоки (streams) являются одной из самых мощных (и сложных) компонент стандартной библиотеки С++. Их применение при простом, неформатированном вводе-выводе в целом не представляет трудностей, однако ситуация усложняется, если необходимо


Глава 4 Потоки

Из книги автора

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


Глава 26 Программные потоки

Из книги автора

Глава 26 Программные потоки 26.1. Введение Согласно традиционной модели Unix, когда процессу требуется, чтобы некое действие было выполнено каким-либо другим объектом, он порождает дочерний процесс, используя функцию fork, и этим порожденным процессом выполняется необходимое


Глава 31 Потоки (STREAMS)

Из книги автора

Глава 31 Потоки (STREAMS) 31.1. Введение В этой главе мы приводим обзор потоков STREAMS и функций, используемых приложением для доступа к потоку. Наша цель — понять, как реализованы сетевые протоколы в рамках потоковых систем. Также мы создаем простой клиент TCP с использованием TPI —