Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Покинутые мьютексы



Если поток завершается, не освободив мьютекс, которым он владеет, мьютекс ста­новится покинутым, а его дескриптор переходит в сигнальное состояние. Функция 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.005 с)...