Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Оснащения врачебно-сестринской бригады.
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2020-11-19 | 193 |
5.00
из
|
Заказать работу |
|
|
Цель работы
Изучить работу с мьютексами. Закрепить полученные в практической работе №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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!