Практическое занятие №3. Синхронизация процессов — КиберПедия 

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Практическое занятие №3. Синхронизация процессов

2020-11-19 193
Практическое занятие №3. Синхронизация процессов 0.00 из 5.00 0 оценок
Заказать работу

Цель работы

Изучить работу с мьютексами. Закрепить полученные в практической работе №2 навыки по выделению критический секций кода до уровня разделяемых системных ресурсов.

Порядок выполнения практических заданий

1. Рассмотреть представленный пример, и разработать приложения на его основе.

2. Разработать алгоритм решения второго задания. Определить критические фрагменты алгоритма и возможные разделяемые ресурсы и защитить их мьютексами.

3. Реализовать алгоритм с применением функций WinAPI и протестировать его на нескольких примерах.

Литературные источники

1. Э.Таненбаум. Распределённые системы. Принципы и парадигмы / Э.Таненбаум, Танненбаум, М. ванн Стесн. — СПб.:Питер, 2003. — 877с.

2. Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учётом специфики 64-разрядной версии Windows/ Рихтер Дж. — СПб.:Питер, 2001. — 752с.

3. Эндрюс Г.Р. Основы многопоточного, параллельного и распределённого программирования/ Эндрюс Г.Р. — М.: «Вильямс», 2003. — 512с.

4.Гергель В.П. Теория и практика параллельных вычислений /Гергель В.П. — М.: ИНТУИР.РУ Интернет-Университет Информационных Технологий, 2007.

Теоретическая часть

Мьютексы в Windows

Для решения проблемы взаимного исключения между параллельными потоками, выполняющимися в контексте разных процессов, в операционных системах Windows используется объект ядра мьютекс. Слово мьютекс является переводом английского слова mutex, которое в свою очередь является сокращением от выражения mutual exclusion, что на русском языке значит взаимное исключение. Мьютекс находится в сигнальном состоянии, если он не принадлежит ни одному потоку. В противном случае мьютекс находится в несигнальном состоянии. Одновременно мьютекс может принадлежать только одному потоку.

Создается мьютекс вызовом функции CreateMutex, которая имеет следующий прототип:

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES lpMutexAttributes, // атрибуты защиты

BOOL bInitialOwner, // начальный владелец мьютекса

LPCTSTR lpName // имя мьютекса

);

Пока значение параметра LPSECURITY_ATTRIBUTES будем устанавливать в NULL. Это означает, что атрибуты защиты заданы по умолчанию, то есть дескриптор мьютекса не наследуется и доступ к мьютексу имеют все пользователи. Теперь перейдем к другим параметрам.

Если значение параметра bInitialOwner равно TRUE, то мьютекс сразу переходит во владение потоку, которым он был создан. В противном случае вновь созданный мьютекс свободен. Поток, создавший мьютекс, имеет все права доступа к этому мьютексу.

Значение параметра lpName определяет уникальное имя мьютекса для всех процессов, выполняющихся под управлением операционной системы. Это имя позволяет обращаться к мьютексу из других процессов, запущенных под управлением этой же операционной системы. Длина имени не должна превышать значение MAX_PATH. Значением параметра lpName может быть пустой указатель NULL. В этом случае система создает безымянный мьютекс. Отметим также, что имена мьютексов являются чувствительными к нижнему и верхнему регистрам.

В случае удачного завершения функция CreateMutex возвращает дескриптор созданного мьютекса. В случае неудачи эта функция возвращает значение NULL. Если мьютекс с заданным именем уже существует, то функция CreateMutex возвращает дескриптор этого мьютекса, а функция GetLastError, вызванная после функции CreateMutex вернет значение ERROR_ALREADY_EXISTS.

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

BOOL ReleaseMutex(

HANDLE hMutex // дескриптор мьютекса

);

В случае успешного завершения функция ReleaseMutex возвращает значение TRUE, в случае неудачи – FALSE. Если поток освобождает мьютекс, которым он не владеет, то функция ReleaseMutex возвращает значение FALSE.

Для доступа к существующему мьютексу поток может использовать одну из функций CreateMutex или OpenMutex. Функция CreateMutex используется в тех случаях, когда поток не знает, создан или нет мьютекс с указанным именем другим потоком. В этом случае значение параметра bInitialOwner нужно установить в FALSE, так как невозможно определить какой из потоков создает мьютекс. Если поток использует для доступа к уже созданному мьютексу функцию CreateMutex, то он получает полный доступ к этому мьютексу. Для того чтобы получить доступ к уже созданному мьютексу, поток может также использовать функцию OpenMutex, которая имеет следующий прототип:

HANDLE OpenMutex (

DWORD dwDesiredAccess, // доступ к мьютексу

BOOL bInheritHandle // свойство наследования

LPCTSTR lpName // имя мьютекса

);

Параметр dwDesiredAccess этой функции может принимать одно из двух значений:

MUTEX_ALL_ACCESS

SYNCHRONIZE

В первом случае поток получает полный доступ к мьютексу. Во втором случае поток может использовать мьютекс только в функциях ожидания, чтобы захватить мьютекс, или в функции ReleaseMutex, для его освобождения. Параметр bInheritHandle определяет свойство наследования мьютекса. Если значение этого параметра равно TRUE, то дескриптор открываемого мьютекса является наследуемым. В противном случае – дескриптор не наследуется.

В случае успешного завершения функция OpenMutex возвращает дескриптор открытого мьютекса, в случае неудачи эта функция возвращает значение NULL.

Практическая часть

Пример 1

Приложение создаёт три потока, которые сигнализируют системным динамиком с заданной периодичностью и частотой. Написать приложение, которое будет корректно реализовать заданную функциональность даже при запуске нескольких копий приложения.

Разрешение проблемы незнания программы о существовании своей копии.

Мьютексы позволяют потоку получить в монопольное владение определённый ресурс и тем самым обеспечить сохранность данных. С его помощью мы сможем решить проблему незнания программы о существовании своей копии и конфликтов на этой почве.

Для начала объявим глобальные переменные:

volatile BOOL Exit;

HANDLE hMutex;

В функцию, создающую потоки добавим, перед созданием потоков, проверку на открытие мьютекса. То есть, если мьютекс с таким именем уже существует, значит копия программы уже есть и мы просто делаем OpenMutex, иначе CreateMutex.

Наша функция (фрагмент кода можно интегрировать в функцию нажатия на кнопку в форме):

if (OpenMutex(SYNCHRONIZE, FALSE, "myMutex") == NULL)

hMutex = CreateMutex(NULL, FALSE, "myMutex");

else

hMutex = OpenMutex(SYNCHRONIZE, FALSE, "myMutex");

HANDLE hFirst = CreateThread(NULL, 0, FirstFunc, NULL, NULL, NULL);

HANDLE hSecond = CreateThread(NULL, 0, SecondFunc, NULL, NULL, NULL);

HANDLE hThird = CreateThread(NULL, 0, ThirdFunc, NULL, NULL, NULL);

Функция потока:

DWORD WINAPI FirstFunc (LPVOID pParam)

{

while(!Exit)

{

if (WaitForSingleObject(hMutex, INFINITE) == WAIT_OBJECT_0)

{

for (int i = 0; i<= 4; i++)

Beep(100, 250);

ReleaseMutex (hMutex);

}

}

return (0);

}

Варианты заданий

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

 


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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.019 с.