Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Реентерабельные и потокобезопасные модули






То, что C# программист называет методом, с точки зрения потока ОС является модулем. Уже говорилось, что один и тот же модуль может быть вызван в разных потоках, так что код модуля будет одновременно выполняться на разных процессорах (ядрах) компьютера. Для гарантирования корректной работы модуля в такой ситуации на него накладываются определенные ограничения. Рассмотрим два важных понятия - реентерабельного и потокобезопасного модуля.

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

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

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

Итоги

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

Для осуществления реальных параллельных вычислений принципиально важным был и тот факт, что потоки могли создаваться и уничтожаться динамически. Один поток во время своей работы мог породить множество дочерних потоков. Это позволяло реализовать настоящий параллелизм - одновременное выполнение несколькими потоками модулей, принадлежащих одному приложению. Многопоточные приложения позволяют реализовать параллельные вычисления.

Создание многопоточных приложений сопряжено с двумя видами трудностей:

· Велики накладные расходы. На создание и обслуживание потока ОС требуется память и время (создание соответствующих структур данных, поддержка их работы). Создание и уничтожение потока - это достаточно дорогие операции. Поэтому излишнее увлечение многопоточностью может привести к потере эффективности работы приложения вместо желаемого ее улучшения.

· Реализация многопоточного приложения требует усложнения алгоритма. Алгоритм, допускающий распараллеливание, зачастую сложнее последовательного алгоритма, решающего одну и ту же задачу. Но есть приятные исключения. Более того, иногда распараллеливание может быть выполнено автоматически с минимальными затратами для программиста.

 


Для поддержки работы с потоками библиотека классов каркаса FCL предоставляет классы, собранные в пространство имен Threading.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.