Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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: 372; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию