Семафоры в Win32


Создание семафора производится функцией c.
HANDLE CreateSemaphor(
LPSECURITY_ATTRIBUTES sa,
LONG InitialCount,
LONG MaximumCount,
LPCTSTR Name)
1-Права доступа к объекту семафор.
2-Начальное значение семафора
3-максимальное значение семафора
4-Имя объекта семафор(м.б NULL)
Открытие семафора HANDLE OpenSemaphore(
DWORD Access,
BOOL InheritHandle,
LPCTSTR Name)
1-Доступ. 2- Будет ли этот описатель наследоваться, в случае если один процесс будет порождать другой.
P – операция осуществляется функцией ожидания, которая проверяет значение счётчика семафора .Если значение счётчика >0, то функция ожидания уменьшает его на 1 и разрешает потоку выполнятся дальше. Если значение счётчика =0, то функция ожидания приостанавливает процесс до момента, пока уменьшение не станет возможным.
V – операция осуществляется вызовом функции
ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount)
1 — над каким семафором выполняется v- операция. 2 – Сколько единиц ресурса освободится. 3- указатель на переменную типа LONG, куда заносится значение счётчика семафора до его изменения. Использование этой функции с 3-м параметром не NULL является единственным способом узнать значение счётчика семафора. Получить значение счётчика, можно только изменив его.
HANDLE hSem;
LONG Max,Cnt;
……………
Max=1;Cnt =1;
hSem =CreateSemaphore(NULL,Cnt,Max,NULL);
…………….
CloseHandle(hSem);
Функция потока.
Switch(WaitForSingleObject(hSem,0L))
{
case WAIT_OBJECT_0:
//произвести доступ к критическому участку кода.
break;
case WaiT_TIMEOUT:
//семафор занят.
}
ReleaseSemaphore(hSem,1,NULL);

Загрузка...