3468
.pdfРис. 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