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

      Комментарии к записи Глобальные переменные не использовать! 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 о новом элементе;

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

? поток 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

#include

using namespace std;

void thread()

{

int i;

for (i = 0; i10 ; i++)

{

cout

Sleep(500);

}

cout

}

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

}

// закрываем дескриптор потока 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) означает, что все объекты синхронизации находились или перешли в сигнальное состояние и, по крайней мере, один их них был забытым мьютексом;

ТРЭШ ЛОТО: ВОКРУГ СВЕТА — ЯПОНИЯ