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