Приветствую Вас Гость • Регистрация • Вход • RSS
Воскресенье, 4.12.2016
Главная » Файлы » Қазақша рефераттар » Информатика [ Добавить материал ]

Синхронизация.Использование мьютекса


Оқушылар,студенттер,мұғалімдер,сайт қолданушылары өз материалыңызбен бөліссеңіз қуанышты болатын едік!

03.01.2016, 19:00

Задание на лабораторную работу: Создать приложение, демонстрирующее работу мьютекса, используя графический интерфейс Windows 2000.

Теоретические сведения

Если поток является владельцем мьютекса, он обладает правом эксклюзивного использования ресурса, который защищается этим мьютексом. Ни один другой поток не может завладеть мьютексом, который уже принадлежит одному из по¬токов. Вместе с тем поток, являющийся владельцем мьютекса, может попытать¬ся стать владельцем мьютекса повторно. Если поток присваивал себе мьютекс несколько раз, он обязан освободить его такое же количество раз. Вызовы, пред-назначенные для работы с мьютексами, перечислены в табл. 1.

Таблица 1 - Вызовы для работы с мьютексами

Вызов    Предназначение
CreateMutex    Создает новый мьютекс или открывает уже существующий
OpenMutex              Открывает существующий мьютекс
ReleaseMutex    Освобождает мьютекс и делает его доступным для других потоков
                                                                                                                                                                                                                                                                                          
Если мьютекс защищает файл, он сможет выполнить свою функцию только в случае, если перед обращением к файлу каждый из потоков будет проверять состояние этого мьютекса. Операционная система никак не связывает мьютексы с какими-либо ресурсами. Windows расценивает мьютекс как объект общего доступа, который можно пере¬вести в сигнальное состояние или сбросить. Потоки должны самостоятельно анализировать текущее состояние мьютексов и продолжать функционирование в соответствии с тем, для чего предназначен тот или иной мьютекс.
Чаще всего мьютексы используются для синхронизации процессов, однако в некоторых случаях мьютексы используют для обеспечения синхронной работы нескольких потоков в рамках одного процесса.
 Мьютекс сигнализирует о том, что поток эксклюзивно владеет тем или иным ресурсом. В любой момент времени мьютексом владеет не более одного потока. Если поток является хозяином мьютекса, он может повторно завладеть им лю¬бое количество раз. Поток сохраняет за собой права на владение мьютексом до тех пор, пока он не обратится к ReleaseMutex. Если перед этим поток завладел мьютексом несколько раз, чтобы освободить мьютекс, он должен обратиться к ReleaseMutex такое же количество раз. Система будет отказывать всем остальным потокам, пытающимся завладеть мьютексом, до тех пор, пока поток-владелец мьютекса не выполнит завершающее обращение к ReleaseMutex.
Вызов CreateMutex предназначен для создания нового мьютекса, а вызов OpenMutex — для открытия уже существующего мьютекса. 

CreateMutex ( LPSECURITY_ATTRIBUTES lpMutexAttributes, 
                        BOOL bInitialOwner, 
                        LPCTSTR lpName);

LpMutexAttributes  - атрибут безопасности. Должен быть NULL. 
BInitialOwner  - флаг, который определяет начального владельца объекта мьютекса. 
LpName  - указатель на имя объекта мьютекса.
Как и в случае с другими объектами синхронизации, если вы хотите, чтобы мьютекс использовался несколькими разными процессами, вы должны присвоить мьютексу имя. Вызов CreateMutex принимает в качеству аргументов атрибуты безопасности (обычно NULL), флаг, определяющий, будет ли мьютекс изначально принадлежать потоку, который его создает, и имя мьютекса, которое можно не указывать.
Если поток желает завладеть мьютексом, он должен обратиться к одной из функций ожидания объекта синхронизации (например, WaitForSingleObject).
В некоторых ситуациях поток должен ждать перехода в сигнальное состояние нескольких объектов синхронизации. Для этого удобно использовать вызов WaitForMultipleObjects. В качестве одного из аргументов этот вызов принимает массив дескрипторов объектов синхронизации. Если любой из этих объектов пе¬реходит в сигнальное состояние, вызов возвращает вам информацию о том, ка¬кой именно объект изменил свое состояние. Как и при использовании других подобных вызовов, вы можете указать период времени, в течение которого сле¬дует ожидать изменение состояния объектов. Период времени может быть лю¬бым, включая 0 и INFINITE (неограниченное время).
Функция WaitForMultipleObjects возвращает управление вызвавшему потоку в случае, если хотя бы один из ожидаемых объектов изменил свое состояние. Что делать, если вы хотите, чтобы управление было возвращено только в случае, если абсолютно все объекты изменили свое состояние? Для этого необходимо присво¬ить аргументу bWaitAll этой функции значение TRUE.
Еще одним вызовом, позволяющим ожидать изменения состояния нескольких объектов, является вызов MsgWaitForMultipleObjectsEx. Этот вызов позволяет ждать не только изменения состояния объектов, но также передачи программе каких-либо системных сообщений. В частности, программа может ожидать изменения состояния объекта и в то же время реагировать на системные сообщения, такие как, например, WM_PAINT.
Вызов MsgWaitForMultipleObjectsEx можно использовать также для ожидания одновременно и объектов, и сообщений. Другими словами, функция вернет уп¬равление потоку только в случае, если все указанные объекты перейдут в сигналь¬ное состояние и при этом будут приняты все указанные сообщения. 
 Если вызов функции завершается успехом, вызвавший ее поток становится обладате¬лем мьютекса. Чтобы освободить мьютекс, поток-владелец должен обратиться к функции ReleaseMutex. Если ранее поток завладел мьютексом несколько раз (то есть, напри¬мер, этот поток несколько раз обращался к функции WaitForSingleObject в отно¬шении одного и того же мьютекса), чтобы освободить мьютекс, поток должен обратиться к ReleaseMutex точно такое же количество раз. Если мьютекс больше не нужен, программа должна обратиться к вызову CloseHandle для того, чтобы закрыть мьютекс. 
Листинг 1 содержит исходный код простой программы, демонстрирующей применение основных функций работы с мьютексами. Запустите программу. Программа получает в собственное владение мьютекс и отображает на экране простое окно сообщения (message box). He убирайте это окно с экрана. Вместо этого запустите вторую копию программы. Вторая копия не сможет завладеть мьютексом до тех пор, пока первая копия не завершит работу. Другими словами, каждая новая копия программы будет ждать, пока вы не щелкнете по кнопке диалогового окна, тем самым убрав это окно с экрана и завершив работу програм¬мы. Если вы запустили несколько копий программы, в любой момент времени только одна из них сможет вывести на экран окно сообщения.

Листинг 1 - Тестирование работы с мьютексом

#include <windows.h>
#include <iostream.h>
void main()
{
HANDLE  mtx=CreateMutex(NULL,FALSE,"p_mtx");
cout <<"Test mutex\n"; 
cout.flush();

DWORD dwWaitMutex = WaitForSingleObject(mtx, 10000);
    switch(dwWaitMutex)
        {
            case WAIT_OBJECT_0: 
                cout<<"Mutex receved!\n";
                cout.flush();
                MessageBox(NULL, "Программа обладает мьютексом", "МUТЕХ", MB_OK);
                ReleaseMutex(mtx);
                break;
             case WAIT_TIMEOUT:                 
                MessageBox(NULL, "Время ожидания прошло", "МUТЕХ",MB_OK);  
                break;                       
             case WAIT_ABANDONED:
                MessageBox(NULL, "Ошибка при работе с мьютексом", "МUТЕХ",MB_OK) ; 
                break;
         }
CloseHandle(mtx);

 

 

}#include <windows.h>
#include <iostream.h>
void main()
{
HANDLE  mtx=CreateMutex(NULL,FALSE,"NT5BBMTX");
cout <<"Проверяем мьютекс\n"; 
cout.flush();
WaitForSingleObject(mtx,INFINITE);
cout<<"Мьютекс получен!\n";
cout.flush();
MessageBox(NULL, "Программа обладает мьютексом", "МUТЕХ",  
MB_OK);
ReleaseMutex(mtx);
CloseHandle(mtx);
}


Похожие материалы

Рахмет ретінде астында тұрған жарнамалардың біреуін басуды сұраймын!

Категория: Информатика | Добавил: Admin
Просмотров: 350 | Загрузок: 0 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]