Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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





Поделиться с друзьями:


Дата добавления: 2016-11-24; Мы поможем в написании ваших работ!; просмотров: 543 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Лучшая месть – огромный успех. © Фрэнк Синатра
==> читать все изречения...

2257 - | 2143 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.