Семафоры.
Семафор (Semaphore) создается функцией CreateSemaphore(). Он очень похож на мьютекс, только в отличие от него у семафора есть счетчик. Семафор открыт если счетчик больше 0 и закрыт, если счетчик равен 0. Семафором обычно "огораживают" наборы равнозначных ресурсов (элементов), например очередь, список и т.п.
| Пример: Классический пример использования семафора это очередь элементов, которую обрабатывают несколько потоков. Потоки "разбирают" элементы из очереди. Если очередь пуста, потоки должны "спать", ожидая появления новых элементов. Для учета элементов в очереди используется семафор. |
class CMyQueue
{
HANDLE m_hSemaphore;
// Семафор для учета элементов очереди
// Описание других объектов
// для хранения элементов очереди
public:
CMyQueue()
{
m_hSemaphore = CreateSemaphore(NULL,
0,
1000, NULL);
//начальное значение счетчика = 0
//максимальное значение = 1000
// Инициализация других объектов
........
}
~CMyQueue()
{
CloseHandle( m_hSemaphore);
// Удаление других объектов
}
void AddItem(void * NewItem)
{
// Добавляем элемент в очередь
// Увеличиваем счетчик семафора на 1.
ReleaseSemaphore(m_hSemaphore,1, NULL);
}
void GetItem(void * Item)
{
// Если очередь пуста, то потоки, вызвавшие этот метод,
// будут находиться в ожидании...
WaitForSingleObject(m_hSemaphore,INFINITE);
// Удаляем элемент из очереди
}
};
Комментариев нет:
Отправить комментарий