Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Если поток завершается, не освободив мьютекс, которым он владеет, мьютекс становится покинутым, а его дескриптор переходит в сигнальное состояние. Функция WaitForSingleObject возвратит значение WAIT_ABANDONED_0, а функция WaitForMultipleObjects использует значение WAIT_ABANDONED_0 как базовое для того, чтобы сообщить, что дескрипторы в сигнальном состоянии представляют покинутые мьютексы.
Переход дескрипторов покинутых мьютексов в сигнальное состояние — очень удобное свойство, недоступное для КС. Появление покинутых мьютексов говорит о том, что в коде, возможно, есть ошибки, так как потоки должны программироваться таким образом, чтобы отдавать ресурсы перед завершением. Возможно также, что поток был завершен другим потоком.
Семафоры
Семафоры поддерживают счетчик и объект-семафор переходит в сигнальное состояние, когда значение этого счетчик больше нуля. При нулевом значении счетчика объект находится в несигнальном состоянии.
Потоки или процессы выполняют обычное ожидание, используя одну из функций ожидания. Когда ожидающий поток освобожден, счетчик семафора уменьшается на 1.
Функции для работы с семафорами — CreateSemaphore, OpenSemaphore и ReleaseSemaphore, которые могут увеличить счетчик на 1 или большее число. Эти функции похожи на свои аналоги для мьютексов.
HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES lpsa,
LONG cSemInitial, LONG cSemMax, LPCTSTR lpszSemName)
Параметр cSemMax, который должен быть равен 1 или большему числу, указывает максимальное значение для семафора. Параметр cSemInitial, имеющий значение в промежутке от 0 до cSemMax, является начальным, и значение семафора никогда не должно выходить за указанные пределы. Об ошибке сообщает возвращенное функцией значение NULL.
Уменьшить счетчик на 1 можно любой функцией ожидания, но освобождение семафора может увеличить его значение на любое число вплоть до максимума.
BOOL ReleaseSemaphore (HANDLE hSemaphore,
LONG cReleaseCount, LPLONG lpPreviousCount)
Отметим, что вы можете определить и предыдущее значение счетчика, но если такой необходимости нет, указатель lpPreviousCount может иметь значение NULL.
Счетчик освобождения должен быть больше нуля, но если это заставит семафор превысить максимально возможное значение, то функция не выполнится, возвратит значение FALSE и счетчик останется не измененным. Освобождение семафора с большим значением счетчика является способом получения текущего значения его счетчика в одной операции (конечно же, это значение немедленно может изменить другой поток).
Мнение о семафоре как о мьютексе с максимальным значением 1 было бы ошибочным, так как семафор не может иметь владельца. Семафор может освободить любой поток, а не только тот, который выполнит ожидание. Более того, так как нет владения семафором, он не может быть покинут.
Дата публикования: 2015-11-01; Прочитано: 348 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!