|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Critical Section Objects
Critical section objects provide synchronization similar to that provided by mutex objects, except that critical section objects can be used only by the threads of a single process. Event, mutex, and semaphore objects can also be used in a single-process application, but critical section objects provide a slightly faster, more efficient mechanism for mutual-exclusion synchronization. Like a mutex object, a critical section object can be owned by only one thread at a time, which makes it useful for protecting a shared resource from simultaneous access. For example, a process could use a critical section object to prevent more than one thread at a time from modifying a global data structure.
The process is responsible for allocating the memory used by a critical section. Typically, this is done by simply declaring a variable of type CRITICAL_SECTION. Before the threads of the process can use it, the critical section must be initialized by using the InitializeCriticalSection function. A thread uses the EnterCriticalSection or TryEnterCriticalSection function to request ownership of a critical section. It uses the LeaveCriticalSection function to release ownership of a critical section. If the critical section object is currently owned by another thread, EnterCriticalSection waits indefinitely for ownership. In contrast, when a mutex object is used for mutual exclusion, the wait functions accept a specified time-out interval. The TryEnterCriticalSection function attempts to enter a critical section without blocking the calling thread.
Once a thread owns a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. To release its ownership, the thread must call LeaveCriticalSection once for each time that it entered the critical section. Any thread of the process can use the DeleteCriticalSection function to release the system resources that were allocated when the critical section object was initialized. After this function has been called, the critical section object can no longer be used for synchronization.
When a critical section object is owned, the only other threads affected are those waiting for ownership in a call to EnterCriticalSection. Threads that are not waiting are free to continue running.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Критические Объекты Секции
Критические объекты секции обеспечивают синхронизацию аналогичную на которая предусматривалась mutex объектами, за исключением того эта критическая секция возражает может использоваться только резьбой единственного процесса. Случай, mutex, и объекты семафора могут также использованы в единственном процессе приложения, но критические объекты секции обеспечивают немного более быстрый, более эффективный механизм для взаимного исключения синхронизации. Подобно объекту mutex, критический объект секции может быть принадлежащим только одной резьбе за один раз, который делает это полезным для защищать коллективного ресурса из одновременного доступа. Например, процесс мог бы использовать критический объект секции против предохранять более, чем один резьба за один раз чтобы модифицировать глобальную структуру данных.
Процесс ответственный за распределение памяти использованной критической секцией. Обычно, это сделан посредством просто объявлять переменную типа CRITICAL_SECTION. Прежде, чем резьба процесса может использовать это, критическая секция должна быть инициализирована использованием функции InitializeCriticalSection. Резьба использует EnterCriticalSection или функцию TryEnterCriticalSection, чтобы запрашивать собственность на критическую секцию. Это использует функцию LeaveCriticalSection, чтобы выпускать собственность на критическую секцию. Если критический объект секции к настоящему времени принадлежащий другой резьбе, ожидания EnterCriticalSection неопределенно для собственности. На контрасте, когда объект mutex использован для взаимного исключения, функции ожидания принимают определенный интервал задержки. Функция TryEnterCriticalSection пытается вводить критическую секцию не блокируя вызов резьбы.
Как только резьба будет обладать критической секцией, она может сделать дополнительными вызовами на EnterCriticalSection или TryEnterCriticalSection не блокируя выполнение. Это предохраняет резьбу от deadlocking себя при ожидании критической секции, которым он уже обладает. Чтобы выпускать свою собственность, резьба должна назвать LeaveCriticalSection как только в течение всякий раз, когда, который он ввел критическую секцию. Любая резьба процесса может использовать функцию DeleteCriticalSection, чтобы выпускать системные ресурсы, которые были распределены когда критический объект секции был инициализирован. После того, как эта функция будет названа, критический объект секции не может больше использован для синхронизации.
Когда критический объект секции принадлежал, единственная другая неестественная резьба является тем ожиданием собственности на вызове на EnterCriticalSection. Резьба, что - не ожидание свободно, чтобы продолжать работать.
|
|
|
|
| |