КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Исключающий семафор (mutex)
Еще один вид синхронизаторов - исключающий семафор (мьютекс – mutual exclusion). Основное его отличие от критического раздела заключается в том, что последний можно использовать только в пределах одного процесса (одного запущенного приложения), а исключающими семафорами могут пользоваться разные процессы. Другими словами, критические разделы - это локальные объекты, которые доступны в рамках только одной программы, а исключающие семафоры могут быть глобальными объектами, позволяющими синхронизировать работу программ (т. е. разные запущенные приложения могут разделять одни и те же данные).
1. Создание объекта mutex: HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); Параметры: lpMutexAttributes - указатель на структуру SECURITY_ATTRIBUTES (в Windows 95 данный параметр игнорируется); bInitialOwner - указывает первоначальное состояние созданного объекта (TRUE - объект сразу становится занятым, FALSE - объект свободен); lpName - указывает на строку, содержащую имя объекта. Имя необходимо для доступа к объекту других процессов, в этом случае объект становится глобальным и им могут оперировать разные программы. Если вам не нужен именованный объект, то укажите NULL. Функция возвращает указатель на объект mutex. В дальнейшем этот указатель используется для управления исключающим семафором. 2. HANDLE OpenMutex(DWORD dwDesiredAccess, // access flag BOOL bInheritHandle, // inherit flag LPCTSTR lpName // pointer to mutex-object name); Позволяет получить указатель на мьютекс, открытый в другом разделе. 3. Закрытие (уничтожение) объекта mutex: BOOL CloseHandle(HANDLE hObject) 3. Универсальная функция запроса доступа: DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) - универсальная функция, предназначенная для запроса доступа к синхронизирующему объекту (в данном случае к объекту mutex).
Параметры: hHandle - указатель на синхронизирующий объект (в данном случае передается значение, возвращенное функцией CreateMutex); dwMilliseconds - время (в миллисекундах), в течение которого происходит ожидание освобождения объекта mutex. Если передать значение INFINITE (бесконечность), то функция будет ждать бесконечно долго. Данная функция может возвращать следующие значения: WAIT_OBJECT_0 - объект освободился; WAIT_TIMEOUT - время ожидания освобождения прошло, а объект не освободился; WAIT_ABANDON - произошел отказ от объекта (т. е. процесс, владеющий данным объектом, завершился, не освободив объект). В этом случае система (а не "процесс-владелец") переводит объект в свободное состояние. Такое освобождение объекта не предполагает гарантий защищенности данных; WAIT_FAILED - произошла ошибка. 4. Освобождение объекта mutex: BOOL ReleaseMutex(HANDLE hMutex) - освобождает объект mutex, переводя его из занятого в свободное состояние. Посмотрим, как выглядит наш пример c критическими разделами, если переписать его, используя исключающие семафоры. Листинг 2. Ограничение доступа к массиву с использованием исключающих семафоров
// Массив значений. int mas[1000]; // Объект, регулирующий доступ к разделяемому коду. HANDLE CritMutex; { ... // Инициализируем семафор разделяемого кода. CritMutex = CreateMutex(NULL,FALSE,NULL); ... // Текст программы. // Закрываем объект доступа к разделяемому коду. CloseHandle(CritMutex); } // Первый поток: запись в массив данных. DWORD WINAPI thread1(LPVOID par) { // Запись значений в массив. // Запрос на вход в защищенный раздел. DWORD dw = WaitForSingleObject(CritMutex,INFINITE); if(dw == WAIT_OBJECT_0) { // Если объект освобожден корректно, то // выполнение кода в защищенном разделе. for(int i = 0;i<1000;i++) { mas[i] = i;
// Выход из защищенного раздела: // освобождаем объект для доступа // к защищенному разделу других задач.
ReleaseMutex(CritMutex); } return 0; }
// Второй поток: считывание данных из массива. DWORD WINAPI thread2(LPVOID par) { // Считывание значений из массива. int j; // Запрос на вход в защищенный раздел. DWORD dw = WaitForSingleObject(CritMutex,INFINITE); if(dw == WAIT_OBJECT_0) { // Если объект освобожден корректно, то // выполнение кода в защищенном разделе. for(int i = 0;i<1000;i++) { j = mas[i]; }
// Выход из защищенного раздела: // освобождаем объект для доступа // к защищенному разделу других задач. ReleaseMutex(CritMutex); } return 0; } Исключающий семафор может быть занят неограниченное количество раз одним и тем же потоком.
http://mbo88.narod.ru/Ch9.html
Дата добавления: 2014-01-07; Просмотров: 312; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |