Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3468

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
5.57 Mб
Скачать

Рис. 38. Фрагмент 5 листинга

51

Задание 2. В созданной программе реализовать следующие возможности управления потоками:

-замедление выполнения потока;

-приостановка выполнения потока и его возобновление;

-ожидание потоком завершения другого потока.

Вопросы по теме:

1.Совместные элементы процесса и индивидуальные элементы потока.

2.Модели управления потоками.

52

ЛАБОРАТОРНАЯ РАБОТА № 4. МЕТОДЫ СИНХРОНИЗАЦИИ ДЛЯ УПРАВЛЕНИЯ НЕСКОЛЬКИМИ ПОТОКАМИ

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

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

Краткие теоретические сведения

Взаимоисключения

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

Если они выполняют операции, не приводящие к конфликтным ситуациям, они должны работать параллельно.

Поведение процессов в критической области представлено на рис. 39.

Рис. 39. Поведение процессов в критической области

53

Требования к критическому участку:

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

ни один процесс не может оставаться внутри критического участка бесконечно долго;

ни один процесс не должен ждать бесконечно долго входа в критический участок.

Механизмы межпроцессного взаимодействия 1. Семафоры

Это механизм, предложенный для синхронизации поведения процессов (концепцию описал Дейкстра 1965 году)

Механизм взаимоисключения может быть реализован с помощью семафоров:

двоичных,

считающих.

С семафором связаны инициализация и две операции:

P(s) - закрытие,

V(s) - открытие.

Двоичный семафор имеет два состояния:

0 (закрытый семафор),

1 (открытый).

При инициализации семафора определяется его начальное состояние:

ИнициализацияСемафора(s, 1); или ИнициализацияСемафора(s, 0);

Операция P(s): if s = 1

then s := 0 { закрыть семафор }

else блокировать обратившийся процесс по s;

54

установить на выполнение готовый процесс;

Операция V(s):

if список процессов, ожидающих s, не пуст then деблокировать процесс, ожидающий S else s := 1; { открыть семафор }

Считающие семафоры полезны при выделении одиночного ресурса из общего пула.

При инициализации в s заносят количественный показатель объема ресурсов пула.

Операция P(s): if s > 0

then s := s - 1 else ожидать на s;

Операция V(s):

if список процессов, ожидающих s не пуст then разрешить одному процессу работать else s := s + 1;

2. Мьютекс

Это упрощенная версия семафора, которая может находиться в одном из двух состояний — блокированном или неблокированном.

3. Монитор

Это механизм организации параллелизма, который содержит как данные, так и процедуры, необходимые для обеспечения доступа к неразделяемым ресурсам.

В простейшем случае монитор состоит из мьютекса и набора процедур, взаимодействующих с общим ресурсом.

55

4. Передача сообщений

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

Это системные вызовы:

send() - посылает сообщение заданному адресату,

recieve() - получает сообщение от указанного источни-

ка.

Если сообщения нет, второй запрос блокируется до поступления сообщения либо немедленно возвращает код ошибки.

5. Барьеры

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

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

Пример барьера приведен на рис. 40.

56

Рис. 40. Пример барьера

Таблица 4 Сравнительная характеристика объектов синхронизации

Характеристика

Критическая

Мьютекс

Семафор

 

 

область

 

 

 

 

 

 

 

1.

Именован-

нет

да

да

ный

защищае-

 

 

 

мый

объект

 

 

 

синхронизации

 

 

 

 

 

 

 

2. Доступность

нет

да

да

из

нескольких

 

 

 

процессов

 

 

 

 

 

 

 

3. Синхрониза-

вхождение

ожидание

ожидание

ция

 

 

 

 

 

 

 

 

 

 

 

57

 

 

Продолжение табл. 4

4.

Освобож-

выход

 

 

 

 

Может

 

быть

Освобожда-

дение

 

 

 

 

 

 

освобожден

ется любым

 

 

 

 

 

 

 

 

или

оставлен

потоком

 

 

 

 

 

 

 

 

без контроля

 

 

 

 

 

 

 

 

 

 

 

5. Права вла-

В

каждый

момент

времени

Понятие

дения

иметь

права

 

владельца

может

владения

 

 

только один поток.

 

 

 

неприме-

 

 

 

 

 

 

 

 

 

 

 

 

нимо.

 

 

 

 

 

 

 

 

 

 

 

 

Он

 

может

 

Он может

вы-

Доступ раз-

 

 

осуществ-

 

полнять

функ-

решен

од-

 

 

лять

вхож-

 

цию

ожидания

новременно

 

 

дение

 

не-

 

несколько

 

раз,

нескольким

 

 

сколько

раз,

 

не

блокируя

потокам,

 

 

не блокируя

 

свое

выполне-

число

кото-

 

 

свое выпол-

 

ние

 

 

 

рых

огра-

 

 

нение.

 

 

 

 

 

 

 

 

ничено мак-

 

 

 

 

 

 

 

 

 

 

 

 

симальным

 

 

 

 

 

 

 

 

 

 

 

 

значением

 

 

 

 

 

 

 

 

 

 

 

 

счетчика

 

 

 

 

 

 

 

 

 

 

Разрешается

 

Вслед

за

по-

Продолжать

 

 

вхождение

 

следним

 

осво-

выполнение

 

 

одного

по-

 

бождением пра-

могут

не-

 

 

тока из чис-

 

ва

владения

сколько по-

6.

Результат

ла

ожидаю-

 

разрешается

токов,

чис-

освобождения

щих

 

 

 

приобрести од-

ло

которых

 

 

 

 

 

 

 

ному потоку из

определяет-

 

 

 

 

 

 

 

числа

ожидаю-

ся

текущим

 

 

 

 

 

 

 

щих

 

 

 

значением

 

 

 

 

 

 

 

 

 

 

 

 

счетчика

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

58

 

 

 

 

 

 

Задание 1. Имеется массив целых чисел, который нужно инициализировать восходящими значениями. Сначала надо "пройти" по массиву и установить значения от 1 до 128, а затем переинициализировать этот массив значениями от 128 до 255. После этого необходимо отобразить финальный поток в окне списка.

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

Ход выполнения задания:

1.Создать Windows приложение в среде Microsoft Visual C# 2008 Framework 3.5

2.Добавить на форму объект Button1, организовать выход из приложения, используя метод Close();

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

static int[] mas= new int[128];

4. Добавить метод, инициализирующий массив заданными в задании значениями:

public void Initmassiv(int n) // 1 или 128

{

for (int i = 0; i < 128; i++)

{

massiv[i] = i + n;

}

}

59

5.Добавить на форму объект Button2 для проведения инициализации массива и объект TextBox1 для выдачи результатов работы

6.По щелчку на объект Button2 организовать инициализацию массива сначала одними значениями, затем другими (по заданию) и выдать результат инициализации:

Initmassiv(1);

Initmassiv(128);

for (int i = 0; i < 128; i++) textBox1.Text += massiv[i] + " ";

7.Запустить программу на выполнение. Пример экранной формы программы инициализации массива от 0 до 128 и от 128 до 255 представлен на рис. 41.

Рис. 41. Экранная форма программы инициализации массива

60

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