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

Семафор


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

03.01.2016, 19:03

Цель лабораторной работы: Изучение объекта ядра Windows 2000 – семафора (Semaphore), с целью использования данного объекта для ограничения одновременного использования заданного ресурса приложения несколькими потоками.

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

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

Помимо мьютексов для ограничения доступа к ресурсам можно использовать семафоры. В отличие от мьютексов, семафор разрешает одновременное использование ресурса для нескольких потоков. Однако при этом максимальное количество потоков, одновременно обладающих доступом к ресурсу, ограничивается. Каждый семафор обладает связанным с ним счетчиком. Чтобы воспользоваться семафором, остальные потоки обязаны ждать до тех пор, пока один из потоков, обладающих доступом к семафору, не обратиться к вызову ReleaseSemaphore. В результате этого вызова значение счетчика увеличится на единицу, и семафором сможет воспользоваться какой-либо другой поток.
При создании семафора необходимо указать начальное значение счетчика. Вызовы, предназначенные для работы с семафорами, перечислены в табл. 1. Семафоры работают очень просто. Каждый раз, когда программа обращается к семафору, значение счетчика семафора уменьшается на единицу. Когда значение счетчика становится равным нулю, семафор становится недоступным.

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

Вызов    Предназначение
CreateSemaphore    Создает новый семафор или открывает существующий
OpenSemaphore             Открывает существующий семафор
ReleaseSemaphore    Добавляет некоторое значение (обычно 1) к счетчику семафора, делая его доступным для большего количества потоков

Если поток обращается к семафору дважды, значение счетчика семафора уменьшается на две единицы. В этом семафоры отличаются от мьютексов, так как если поток несколько раз обращается к мьютексу, это расценивается как одно обращение.
Используя семафор, вы можете организовать работу программы таким образом, что к ресурсу одновременно смогут получить доступ несколько потоков, однако количество этих потоков будет ограничено. Создавая семафор, вы указываете максимальное количество потоков, которые одновременно смогут работать с ресурсом. Если в некоторый момент времени с ресурсом работает меньшее количество потоков, семафор остается в сигнальном состоянии. Как только количество потоков, желающих работать с ресурсом, становится больше допустимого, семафор блокирует доступ к ресурсу.
Для работы с семафором служат вызовы CreateSemaphore и OpenSemaphore:

HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, 
LONG lInitialCount, 
LONG lMaximumCount, 
LPCTSTR lpName ); 

lpSemaphoreAttributes - атрибут безопасности. Обычно устанавливается NULL;
lInitialCount – счётчик для объекта семафор. Значение может быть присвоено в диапазоне от 0 до значения lMaximumCount. Если присвоено значение 0, то семафор «закрыт» и «открыт», если счётчик имеет значение больше 0;
lMaximumCount – некоторое максимальное значение для счётчика семафора. Обычно задаётся по максимальному количеству потоков, желающих иметь доступ к определенному ресурсу, т.е. такое же значение, что и в lInitialCount;
lpName – указатель на имя объекта семафор. Если NULL, то семафор открывается и без указателя. Имя семафора не должно совпадать с именем события, мьютекса или объекта проекция файла.

При создании семафора необходимо указать атрибуты безопасности, начальное значение счетчика, максимальное допустимое значение счетчика и имя (которое можно не указывать). 
Как и в других случаях, вызов CreateSemaphore либо создает новый семафор с указанным именем или открывает уже существующий семафор. Вызов OpenSemaphore срабатывает только в случае, если семафор с указанным именем уже существует.
Листинг 15.1 содержит простую программу, демонстрирующую работу семафора. Прежде чем отобразить на экране окно сообщения, программа пытается обратиться к семафору. Вы можете повторно запустить программу. Когда на экране появляются три окна сообщения, четвертое и все последующие обращения к семафору блокируются. Таким образом, вне зависимости от того, сколько программ ожидают освобождения семафора, на экране будет отображено не более трех окон сообщений. Как только вы закроете одно из окон, соответствующая программа освободит семафор и завершит работу. В этот же момент одна из программ, ожидающих освобождения семафора, получит к нему доступ и выведет на экран окно сообщения.

Листинг 15.1 -  Демонстрация работы семафора

#include <windows.h> 
#include <iostream.h>
void main()
{
HANDLE sem=CreateSemaphore(NULL, 3,3, "nt5bbsem" );
cout<<" Проверяем состояние семафора\n"';
cout.flush();
WaitForSingleObject(sem, INFINITE);
cout<<" Получен доступ к семафору\n";
cout.flush();
MessageBox(NULL, "Получен доступ к семафору", "Semaphore", 
MB_OK); 
ReleaseSemaphore(sem, 1,  NULL );
CloseHandle(sem);
}

Вопросы к защите

1.    Понятие синхронизации потоков.
2.    Дайте определение понятия семафор.
3.    Поясните назначение функций CreateSemaphore, OpenSemaphore, ReleaseSemaphore.
4.    Для чего необходимо использовать при работе  с семафорами функции Wait?





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