![]() Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
![]() Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
![]() |
Объект ядра «семафор» создается вызовом функции
function CreateSemaphore (…): THandle; Любой процесс может получить свой описатель существующего объекта «семафор», вызвав функцию OpenSemaphore: Поток увеличивает значение счетчика текущего числа ресурсов, вызывая функцию ReleaseSemaphore Критическая секция Критическая секция — это небольшой участок кода, требующий монопольного доступа к каким-то общим данным. Она позволяет сделать так, чтобы единовременно только один ПОТОК получал доступ к определенному ресурсу. При работе с критическими секциями выполняются следующие действия: 1. Создается экземпляр структуры CRITICAL_SECTION. Например: VAR cs:TRTLCriticalSection; 2. Инициализируется критическая секция. Сделать это надо до обращения какого-либо потока к защищенному ресурсу. Критическая секция инициализируется вызовом процедуры InitializeCriticalSection: 3. При обращении к разделяемому ресурсу, вызывается процедура EnterCriticaSecton. Процедура EnterCriticalSection допустит выполнение вызвавшего ее потока, если определит, что критическая секция свободна. В ином случае EnterCriticalSection заставит поток ждать, пока критическая секция не освободится. 4. Поток, покидая участок кода, где он работал с защищенным ресурсом, должен вызвать процедуру LeaveCriticalSection. уведомляет ресурс освободился. 5. DeleteCriticalSection удаление критической секции. Необходимо обеспечить, чтобы в каждый момент времени в критической секции, связанной с этими данными, находился только один поток. При этом неважно, находится этот поток в активном или в приостановленном состоянии. Самый простой и в то же время самый неэффективный способ обеспечения взаимного исключения состоит в том, что ОС позволяет потоку запрещать любые прерывания на время его нахождения в критической секции. Однако этот способ практически не применяется, так как опасно доверять управление системой пользовательскому потоку — он может надолго занять процессор, а при крахе потока в критической секции крах потерпит вся система, потому что прерывания никогда не будут разрешены. Mutex Объекты ядра Mutex гарантируют потокам взаимоисключающий доступ к единственному ресурсу. По сути работает как критическая секция, но т.к. он объект ядра, может использоваться для синхронизации разных потоков и их процессов. CreateMutex(….): OpenMutex(…) – получить дескриптор мьютекса: Поток получает доступ к разделяемому ресурсу, вызывая одну из Wait -функций и передавая ей дескриптор мьютекса, который охраняет этот ресурс. Wait-функция проверяет состояние мьютекса. Если объект мьютекс свободен, Wait-функция переводит мьютекс в занятое состояние и разрешает продолжение выполнения потока. Если Wait -функция определяет, что мьютекса занят, то поток переходит в состояние ожидания освобождения объекта мьютекс. Когда ожидание мьютекса потоком успешно завершается, последний получает доступ к защищенному ресурсу. Все остальные потоки, пытающиеся обратиться к этому ресурсу, переходят в состояние ожидания. Date: 2015-08-15; view: 418; Нарушение авторских прав |