Глобальные переменные не использовать! 4 страница

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива.

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− -известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будут выведены на консоль k элементов).

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

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− cортировка методом “пузырька”. Элементы - вещественные числа двойной точности;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени.

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком main, использовать бинарный семафор!):

− ждёт от потока main сигнал о начале суммирования;

− выполнить суммирование элементов итогового массива до заданной позиции k;

− вывести итоговую сумму.

4.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток MultElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work.

Поток work должен выполнить следующие действия (Для синхронизации с потоком main – использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main, объяснить отличия, если есть!):

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве элементов из диапазона [A,B] (разместить их в массиве слева, остальные элементы массива - заполнить нулями). Элементы - целые числа без знака. Числа A,B ввести в потоке main.

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток MultElement о начале работы (момент запуска произойдёт после того, будет сформирована часть итогового массива (когда будут найдены все элементы из диапазона [A, B]).

Поток MultElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!):

− ждёт от потока work сигнал о начале работы;

− выполнить произведение элементов итогового массива (когда будут найдены все элементы из диапазона [A, B]);

− вывести произведение.

5.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будут выведены на консоль k элементов массива).

Поток work должен выполнить следующие действия (Для синхронизации с потоком main -использовать семафор. Проверить работу программы используя критическую секцию для синхронизации с потоком main, объяснить отличия, если есть!)'.

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− сортировка выбором. Элементы - символы;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени.

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком main, использовать бинарный семафор!)'

− ждёт от потока main сигнал о начале суммирования;

− выполнить суммирование элементов (кодов символов) итогового массива до заданной позиции k;

− вывести итоговую сумму.

6.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− запросить число А;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work.

Поток work должен выполнить следующие действия (Для синхронизации с потоком main -использовать семафор. Проверить работу используя бинарный семафордля синхронизации с потоком main, объяснить отличия, если есть!):

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве элементов >А (разместить их в массиве слева, остальные элементы массива -заполнить нулями). Элементы - целые числа без знака. Число А ввести в потоке main;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будет сформирован итоговый массив.

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!):

− от потока work сигнал о начале суммирования;

− выполнить суммирование элементов итогового массива;

− вывести итоговую сумму.

7.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будут готовы к печати k - элементов массива).

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

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− Поиск в массиве простых чисел (разместить их в массиве слева, остальные элементы массива - справа). Элементы - целые числа без знака.

− извещать поток main о новом элементе, после каждого готового элемента отдыхать в течение заданного интервала времени;

− поток SumElement должен выполнить следующие действия Для синхронизации с потоком main, использовать бинарный семафор!

− ждёт от потока main сигнал о начале суммирования;

− выполнить суммирование элементов итогового массива до заданной позиции k, вывести итоговую сумму.

8. Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− запустить поток work;

− запустить поток CountElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− запросить символ X;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− поток work должен выполнить следующие действия (Для синхронизации с потоком main - использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main, объяснить отличия, если есть!)

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве элементов =Х (разместить их в массиве слева, остальные элементы массива -справа). Элементы - символы. X ввести в потоке main;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток CountElement о начале работы (момент запуска произойдёт после того, будет сформирован итоговый массив.

Поток CountElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!)

− ждёт от потока work сигнал о начале суммирования;

− подсчитать количество элементов равных X;

− вывести итоговую сумму.

9.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток MultElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− известить поток MultElement о начале работы (момент запуска произойдёт после того, будут выведены на консоль k элементов массива).

− поток work должен выполнить следующие действия (Для синхронизации с потоком main - использовать семафор. Проверить работу программы используя критическую секцию для синхронизации с потоком main, объяснить отличия, если есть!)

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве элементов <А (разместить их в массиве слева, остальные элементы массива - справа). Элементы - вещественные числа. Число А ввести в потоке main;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− поток MultElement должен выполнить следующие действия (Для синхронизации с потоком main, использовать бинарный семафор!)

− ждёт от потока main сигнал о начале суммирования;

− выполнить произведение элементов итогового массива до заданной позиции k;

− вывести итоговое произведений.

10.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива.

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− поток work должен выполнить следующие действия (Для синхронизации с потоком main - использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main, объяснить отличия, если есть!)

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве лексем, (разделители - цифры). Полученные лексемы поместить в массиве слева, разделитель - пробел, остальные элементы - заполнить символом ‘0’. Элементы массива - символы;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будет сформирован итоговый массив;

− поток SumElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!)

− ждёт от потока work сигнал о начале суммирования;

− выполнить суммирование элементов (кодов) итогового массива;

− вывести итоговую сумму.

11 .Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будут выведены на консоль k элементов массива);

− поток work должен выполнить следующие действия (Для синхронизации с потоком main- использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main, объяснить отличия, если есть!):

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− приведение массива к палиндрому (получившейся палиндром поместить в массиве слева, а лишние элементы соответственно - справа ) Элементы – символы извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком main, использовать критическую секцию!):

− ждёт от потока main сигнал о начале суммирования;

− выполнить суммирование элементов (кодов) итогового массива до заданной позиции k;

− вывести итоговую сумму.

12. Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− запустить поток work;

− запустить поток MultElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

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

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве; сортировка выбором. Элементы - целые числа, извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток MultElement о начале работы (момент запуска произойдёт после того, будет сформирован итоговый массив.

Поток MultElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать бинарный семафор!):

− ждёт от потока work сообщения о начале суммирования;

− выполнить произведение элементов итогового массива;

− вывести произведение.

13. Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− ввести число k;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будут выведены на консоль k элементов массива).

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

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве элементов, соответствующих цифрам (слева поместить в массив цифры, а остальные элементы массива - заполнить пробелами). Элементы - символы.

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком main, использовать бинарный семафор!):

− ждёт от потока main сообщения о начале суммирования;

− выполнить суммирование элементов (кодов) итогового массива до заданной позиции k;

− вывести итоговую сумму.

14. Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− запустить поток work;

− запустить поток SumElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

Поток work должен выполнить следующие действия (Для синхронизации с потоком main –использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main, объяснить отличия, если есть!):

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве лексем, начинающихся с цифры (разделители - пробел и тире). Полученные лексемы поместить в массиве слева, а лишние элементы заполнить символом подчеркивания: «_» ). Элементы – символы;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток SumElement о начале суммирования (момент запуска произойдёт после того, будет сформирован итоговый массив.

Поток SumElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!):

− ждёт от потока work сообщения о начале суммирования;

− выполнить суммирование элементов (кодов) итогового массива;

− вывести итоговую сумму.

15.Поток main должен выполнить следующие действия:

− создать массив, размерность и элементы которого вводятся пользователем с консоли;

− вывести размерность и элементы исходного массива на консоль;

− запустить поток work;

− запустить поток Sum/CountElement;

− освобождение выходной поток stdout после вывода на консоль каждого нового элемента массива;

− выводить на экран поэлементно элементы массива (итогового) параллельно с работой потока work;

Поток work должен выполнить следующие действия (Для синхронизации с потоком main- использовать семафор. Проверить работу используя бинарный семафор для синхронизации с потоком main,объяснить отличия, если есть!):

− запросить у пользователя временной интервал, требуемый для отдыха после подготовки одного элемента в массиве;

− поиск в массиве лексем, начинающихся с цифры (разделители – пробел и тире).

− полученные лексемы поместить в массиве слева, а лишние элементы заполнить символом подчеркивания: «_» ). Элементы – символы;

− извещать поток main о новом элементе;

− после каждого готового элемента отдыхать в течение заданного интервала времени;

− известить поток Sum/CountElement о начале суммирования (момент запуска произойдёт после того, будет сформирован итоговый массив;

− поток Sum/CountElement должен выполнить следующие действия (Для синхронизации с потоком work, использовать критическую секцию!):

− ждёт от потока work сообщения о начале суммирования;

− выполнить суммирование и подсчёт элементов (до символов подчеркивания: «_») итогового массива;

− вывести результаты.

Лабораторная работа №5

Тема: Синхронизация процессов при помощи событий и мьютексов

Цель работы:

1. Изучить объекты синхронизации потоков мьютексы и события.

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

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

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

1. Объекты синхронизации и функции ожидания в Windows

В операционных системах Windows объектами синхронизации называются объекты ядра, которые могут находиться в одном из двух состояний: сигнальном (signaled) и несигнальном (nonsignaled). Объекты синхронизации могут быть разбиты на три класса. К первому классу относятся объекты синхронизации, которые служат только для решения проблемы синхронизации параллельных потоков. К таким объектам синхронизации в Windows относятся:

− мьютекс (mutex);

− событие (event);

− семафор (semaphore).

Ко второму классу объектов синхронизации относится ожидающий таймер (waitable timer). К третьему классу объектов синхронизации относятся объекты, которые переходят в сигнальное состояние по завершении своей работы или при получении некоторого сообщения. Примерами таких объектов синхронизации являются потоки и процессы. Пока эти объекты выполняются, они находятся в несигнальном состоянии. Если выполнение этих объектов заканчивается, то они переходят в сигнальное состояние.

Теперь перейдем к функциям ожидания. Функции ожидания в Windows это такие функции, параметрами которых являются объекты синхронизации. Эти функции обычно используются для блокировки потоков, которая выполняется следующим образом. Если дескриптор объекта синхронизации является параметром функции ожидания, а сам объект синхронизации находится в несигнальном состоянии, то поток, вызвавший эту функцию ожидания, блокируется до перехода этого объекта синхронизации в сигнальное состояние. Сейчас мы будем использовать только две функции ожидания WaitForSingleObject и WaitForMultipleObject.

Для ожидания перехода в сигнальное состояние одного объекта синхронизации используется функция WaitForSingleObject, которая имеет следующий прототип:

DWORD WaitForSingleObject(

HANDLE hHandle, // дескриптор объекта

DWORD dwMilliseconds // интервал ожидания в миллисекундах

);

Функция WaitForSingleObject в течение интервала времени, равного значению параметра dwMilliseconds, ждет пока объект синхронизации с дескриптором hHandle перейдет в сигнальное состояние. Если значение параметра dwMilliseconds равно нулю, то функция только проверяет состояние объекта. Если же значение параметра dwMilliseconds равно INFINITE, то функция ждет перехода объекта синхронизации в сигнальное состояние бесконечно долго.

В случае удачного завершения функция WaitForSingleObject возвращает одно из следующих значений:

WAIT_OBJECT_0

WAIT_ABANDONED

WAIT_TIMEOUT

Значение WAIT_OBJECT_0 означает, что объект синхронизации находился или перешел в сигнальное состояние. Значение WAIT_ABANDONED означает, что объектом синхронизации является мьютекс, который не был освобожден потоком, завершившим свое исполнение. После завершения потока этот мьютекс освободился системой и перешел в сигнальное состояние. Такой мьютекс иногда называется забытым мьютексом (abandoned mutex). Значение WAIT_TIMEOUT означает, что время ожидания истекло, а объект синхронизации не перешел в сигнальное состояние. В случае неудачи функция WaitForSingleObject возвращает значение WAIT_FAILED.

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

Листинг 1. Пример использования функциеи WaitForSingleObject

#include <windows.h>

#include <iostream>

using namespace std;

void thread()

{

int i;

for (i = 0; i < 10 ; i++)

{

cout << i << ' '; cout << flush << '\a';

Sleep(500);

}

cout << endl;

}

int main()

{

HANDLE hThread;

DWORD dwThread;

hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, &dwThread); if (hThread == NULL)

return GetLastError();

// ждем завершения потока thread

if(WaitForSingleObject(hThread, INFINITE) != WAIT_OBJECT_0)

{

cout << "Wait for single object failed." << endl; cout << "Press any key to exit." << endl;

}

// закрываем дескриптор потока thread CloseHandle(hThread);

return 0;

}

Для ожидания перехода в сигнальное состояние нескольких объектов синхронизации или одного из нескольких объектов синхронизации используется функция WaitForMultipleObject, которая имеет следующий прототип:

DWORD WaitForMultipleObjects(

DWORD nCount, // количество объектов

CONST HANDLE *lpHandles, // массив дескрипторов объектов

BOOL bWaitAll, // режим ожидания

DWORD dwMilliseconds // интервал ожидания в миллисекундах

);

Функция WaitForMultipleObjects работает следующим образом. Если значение параметра bWaitAll равно TRUE, то эта функция в течение интервала времени, равного значению параметра dwMilliseconds, ждет пока все объекты синхронизации, дескрипторы которых заданы в массиве lpHandles, перейдут в сигнальное состояние. Если же значение параметра bWaitAll равно FALSE, то эта функция в течение заданного интервала времени ждет пока любой из заданных объектов синхронизации перейдет в сигнальное состояние. Если значение параметра dwMilliseconds равно нулю, то функция только проверяет состояние объектов синхронизации. Если же значение параметра dwMilliseconds равно INFINITE, то функция ждет перехода объектов синхронизации в сигнальное состояние бесконечно долго. Количество объектов синхронизации, ожидаемых функцией WaitForMultipleObjects, не должно превышать значения MAXIMUM_WAIT_OBJECTS. Также отметим, что объекты синхронизации не должны повторяться.

В случае успешного завершения функция WaitForMultipleObjects возвращает их следующих значений:

от WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount - 1); от WAIT_ABANDONED_0 до (WAIT_ABANDONED_0 + nCount - 1);

WAIT_TIMEOUT.

Интерпретация значений, возвращаемых функцией WaitForMultipleObjects, зависит от значения входного параметра bWaitAll. Сначала рассмотрим случай, когда значение этого параметра равно TRUE. Тогда возвращаемые значения интерпретируются следующим образом:

- любое из возвращаемых значений, находящихся в диапазоне от WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount - 1), означает, что все объекты синхронизации находились или перешли в сигнальное состояние;

- любое из возвращаемых значений, находящихся в диапазоне от WAIT_ABANDONED_0 до (WAIT_ABANDONED_0 + nCount - 1) означает, что все объекты синхронизации находились или перешли в сигнальное состояние и, по крайней мере, один их них был забытым мьютексом;

Наши рекомендации