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