13.1.2. Доступ к локальным переменным потока

13.1.2. Доступ к локальным переменным потока

Мы знаем об опасности доступа из потока к переменным, определенным вне его области видимости, но мы также знаем, что у потока могут быть локальные данные. А что делать, если поток хочет «обнародовать» часть принадлежащих ему данных?

Для этой цели предусмотрен специальный механизм. Если объект Thread рассматривать как хэш, то к локальным данным потока можно обратиться из любого места в области видимости этого объекта. Мы не хотим сказать, что так можно обратиться к настоящим локальным переменным; это допустимо лишь для доступа к именованным данным, своим для каждого потока.

Существует также метод key?, который сообщает, используется ли указанное имя в данном потоке.

Внутри потока к таким данным тоже следует обращаться, как к хэшу. Метод Thread.current позволяет сделать запись чуть менее громоздкой.

thread = Thread.new do

t = Thread.current

t[:var1] = "Это строка"

t[:var2] = 365

end

# Доступ к локальным данным потока извне...

x = thread[:var1]              # "Это строка"

y = thread[:var2]              # 365

has_var2 = thread.key?("var2") # true

has_var3 = thread.key?("var3") # false

Отметим, что эти данные доступны другим потокам даже после того, их владелец завершил работу (как в данном случае).

Помимо символа (см. выше), для идентификации локальной переменной потока можно употреблять и строки.

thread = Thread.new do

t = Thread.current

t["var3"] = 25

t[:var4] = "foobar"

end

a = thread[:var3] = 25

b = thread["var4"] = "foobar"

He путайте эти специальные имена с настоящими локальными переменными. В следующем фрагменте разница видна более отчетливо:

thread = Thread.new do

 t = Thread.current

 t["var3"] = 25

 t[:var4] = "foobar"

 var3 = 99         # Настоящие локальные переменные

 var4 = "zorch"    # (извне недоступны)

end

a = thread[:var3]  # 25

b = 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"

Ясно, что сокращение не будет работать и в том случае, когда вы имеете дело с объектами наподобие Fixnum, которые хранятся как непосредственные значения, а не ссылки.

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

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

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

8.4.2 Состояния Потока

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

8.4.2 Состояния Потока Каждый поток (istream или ostream) имеет ассоциированное с ним состояние, и обработка ошибок и нестандартных условий осуществляется с помощью соответствующей установки и проверки этого состояния.Поток может находиться в одном из следующих состояний:enum


ОГОРОД КОЗЛОВСКОГО: VBR[Variable Bit Rate - кодирование с переменным битрейтом.], OIS[Optical Image Stabilization - оптическая стабилизация изображения.] и прочие аббревиатуры

Из книги Журнал "Компьютерра" №761 автора Журнал «Компьютерра»

ОГОРОД КОЗЛОВСКОГО: VBR[Variable Bit Rate - кодирование с переменным битрейтом.], OIS[Optical Image Stabilization - оптическая стабилизация изображения.] и прочие аббревиатуры Автор: Козловский ЕвгенийЭтот "Огород" я готовил, пожалуй, дольше любого другого: едва ли не полгода. Все началось в


Доступ к "внешним" переменным

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Доступ к "внешним" переменным Анонимные методы интересны в том отношении, что они позволяют доступ к локальным переменным определяющего их метода. Формально говоря, такие переменные являются "внешними переменными" анонимного метода. Для примера предположим, что наш


Вызов функции с переменным числом аргументов

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Вызов функции с переменным числом аргументов Для вызова функции с переменным числом аргументов не требуется никаких специальных действий: в вызове функции просто задается то число аргументов, которое нужно. В предварительном объявлении (если оно есть) переменное число


Завершение потока

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Завершение потока Как и в случае обсуждавшегося ранее завершения процесса, для потоков мы будем отчетливо различать случаи:• «естественного» завершения выполнения потока из кода самого потока;• завершения потока извне, из кода другого потока или по сигналу. Для этого


«Легковесность» потока

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

«Легковесность» потока Вот теперь, завершив краткий экскурс использования процессов и потоков, можно вернуться к вопросу, который вскользь уже звучал по ходу рассмотрения: почему и в каком смысле потоки часто называют «легкими процессами» (LWP — lightweight process)?Выполним ряд


4.2. Присваивание значений переменным

Из книги Операционная система UNIX автора Робачевский Андрей М.

4.2. Присваивание значений переменным =оператор присваивания (пробельные символы до и после оператора -- недопустимы) Не путайте с операторами сравнения = и -eq!Обратите внимание: символ = может использоваться как в качестве оператора присваивания, так и в качестве


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

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид


4.2. Отмена потока

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

4.2. Отмена потока Обычно поток завершается при выходе из потоковой функции или вследствие вызова функции pthread_exit(). Но существует возможность запросить из одного потока уничтожение другого. Это называется отменой, или принудительным завершением, потока.Чтобы отменить


Создание потока

Из книги C++ для начинающих автора Липпман Стенли

Создание потока Поток создается при первом открытии с помощью системного вызова специального файла устройства, ассоциированного с драйвером STREAMS. Как правило, процесс создает поток в два этапа: сначала создается элементарный поток, состоящий из нужного драйвера и


14.3.1. Присваивание значений переменным среды

Из книги Идеальный программист. Как стать профессионалом разработки ПО автора Мартин Роберт С.

14.3.1. Присваивание значений переменным среды Для присваивания значений переменным среды применяется команда:VARIABLE_NAME=значение; export VARIABLE_NAMEТочка с запятой между двумя командами выступает в роли разделителя команд. К аналогичному результату можно прийти следующим


7.2. Доступ к переменным в блоковых объектах

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

7.2. Доступ к переменным в блоковых объектах Постановка задачи Необходимо понять разницу между доступом к переменным в методах Objective-C и доступом к этим переменным в блоковых


20.7. Состояния потока

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

20.7. Состояния потока Пользователей библиотеки iostream, разумеется, интересует, находится ли поток в ошибочном состоянии. Например, если мы пишемint ival;cin ival;и вводим слово "Borges", то cin переводится в состояние ошибки после неудачной попытки присвоить строковый литерал целому


Зона потока

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

Зона потока О сверхпроизводительном состоянии, называемом «потоком» (flow), написано много литературы. Некоторые программисты называют его «зоной». Как бы оно ни называлось, вероятно, вам знакомо это ощущение предельной концентрации сознания, в которое может войти


Анализ по трем переменным

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

Анализ по трем переменным Широкополосный дельфийский метод хорошо подходит для выбора одной номинальной оценки. Но как говорилось ранее, в большинстве случаев желательно иметь три оценки для создания вероятностного распределения. Оптимистическую и пессимистическую