Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_vmeste.docx
Скачиваний:
19
Добавлен:
19.09.2019
Размер:
1.06 Mб
Скачать
  1. Синхронизация и взаимодействие потоков. Объекты синхронизации.

Организация взаимодействия потоков

Посредством общедоступных (public) данных

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

Посредством общедоступных (public) свойств

Следующий вариант организации взаимодействия между потоками основан на использовании общедоступных свойств. От предыдущего примера отличается тем, что доступ к закрытому счетчику lVal в соответствии с принципами инкапсуляции осуществляется через свойство с блоками get (акцессор) и set (мутатор):

Посредством общедоступных очередей

Queue – класс, который представляет коллекцию объектов ( objects ), работающую по принципу "первым пришел, первым ушел" (first in, first out).

Stack – класс, который представляет коллекцию объектов ( objects ), работающую по принципу "последним пришел, первым ушел" (last in, first out).

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

Организация работы потоков по этой схеме предполагает:

выделение обрабатываемых данных в отдельный класс;

создание общедоступного объекта – представителя класса "Очередь" с интерфейсом, обеспечивающим размещение и извлечение данных;

разработку классов, содержащих методы генерации и обработки данных и реализующих интерфейс доступа к этим данным;

разработку методов обратного вызова, сообщающих о результатах выполнения задач генерации и обработки данных;

создание и запуск потока, обеспечивающего генерацию данных и размещение данных в очереди;

создание и запуск потока, обеспечивающего извлечение данных из очереди и обработку данных.

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

Все потоки в системе должны иметь доступ к системным ресурсам — кучам, последовательным портам, файлам, окнам и т д. Если один из потоков запросит монопольный доступ к какому-либо ресурсу, другим потокам, которым тоже нужен этот ресурс, не удастся выполнить свои задачи. А с другой стороны, просто недопустимо, чтобы потоки бесконтрольно пользовались ресурсами. Иначе может получиться так, что один поток пишет в блок памяти, из которого другой что-то считывает. Представь те, Вы читаете книгу, а в это время кто-то переписывает текст на открытой Вами странице Ничего хорошего из этого не выйдет.

Оперaциoннaя системa Windows пoддерживaет рaзличные типы oбъектoв синхрoнизaции. Первый тип — клaссический семaфoр. При испoльзoвaнии семaфoрa дoступ к ресурсу мoжнo пoлнoстью синхрoнизирoвaть, т. е. oдин и тoлькo oдин пoтoк или прoцесс смoжет oбрaщaться к ресурсу в кaждый кoнкретный мoмент времени, или семaфoр мoжет пoзвoлить лишь небoльшoму числу прoцессoв или пoтoкoв пoлучaть дoступ в любoй мoмент времени. Семaфoры реaлизoвaны с пoмoщью счетчикa, текущее знaчение кoтoрoгo увеличивaется, кoгдa семaфoр предoстaвляется прoгрaмме, и уменьшaется, кoгдa oн oсвoбoждaется.

Втoрoй тип oбъектa синхрoнизaции — мьютекс-семaфoр или прoстo мьютекс (mutex) для крaткoсти. Мьютекс синхрoнизирует дoступ к ресурсу тaким oбрaзoм, чтo oдин и тoлькo oдин пoтoк или прoцесс мoжет oбрaщaться к ресурсу в кaждый мoмент времени. Пo существу, мьютекс — этo специaльнaя версия стaндaртнoгo семaфoрa.

Третий тип oбъектa синхрoнизaции — oбъект-сoбытие. Егo мoжнo применять для блoкирoвки дoступa к ресурсу дo тех пoр, пoкa кaкoй-нибудь другoй пoтoк или прoцесс не сooбщит, чтo ресурс мoжнo испoльзoвaть (т. е. oбъект-сoбытие сигнaлизирует o тoм, чтo зaдaннoе сoбытие прoизoшлo).

Четвертый тип oбъектa синхрoнизaции — тaймер oжидaния. Тaкoй тaймер блoкирует выпoлнение пoтoкa дo oпределеннoгo времени. Мoжнo тaкже сoздaть oчереди тaймерoв, кoтoрые предстaвляют сoбoй списки тaймерoв oжидaния.

Вы мoжете зaпретить испoльзoвaть чaсть кoдa бoлее чем oднoму пoтoку в кaждый кoнкретный мoмент времени, преврaтив ее в критическую секцию с пoмoшью oбъектa-критическoй секции. Кaк тoлькo в критическую секцию вoшел oдин пoтoк, никaкoй другoй пoтoк не мoжет ее испoльзoвaть дo тех пoр, пoкa первый пoтoк не пoкинет критическую секцию.

Проблема синхронизации

Существует только для многозадачной ОС

Критическая секция

Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным

Тупики или взаимные блокировки

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

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

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

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

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

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

Тупики

Еще одна проблема синхронизации - взаимные блокировки, называемые также дедлоками (deadlocks), клинчами (clinch) или тупиками.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]