|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Synchronizing Execution of Multiple Threads
To avoid race conditions and deadlocks, it is necessary to synchronize access by multiple threads to shared resources. Synchronization is also necessary to ensure that interdependent code is executed in the proper sequence.
The Win32 API provides a number of objects whose handles can be used to synchronize multiple threads. These objects include:
· Console input buffers · Events · Mutexes · Processes · Semaphores · Threads · Timers
The state of each of these objects is either signaled or not signaled. When you specify a handle to any of these objects in a call to one of the wait functions, the execution of the calling thread is blocked until the state of the specified object becomes signaled. Some of these objects are useful in blocking a thread until some event occurs. For example, a console input buffer handle is signaled when there is unread input, such as a keystroke or mouse button click. Process and thread handles are signaled when the process or thread terminates. This allows a process, for example, to create a child process and then block its own execution until the new process has terminated.
Other objects are useful in protecting shared resources from simultaneous access. For example, multiple threads can each have a handle to a mutex object. Before accessing a shared resource, the threads must call one of the wait functions to wait for the state of the mutex to be signaled. When the mutex becomes signaled, only one waiting thread is released to access the resource. The state of the mutex is immediately reset to not signaled so any other waiting threads remain blocked. When the thread is finished with the resource, it must set the state of the mutex to signaled to allow other threads to access the resource.
For the threads of a single process, critical-section objects provide a more efficient means of synchronization than mutexes. A critical section is used like a mutex to enable one thread at a time to use the protected resource. A thread can use the EnterCriticalSection function to request ownership of a critical section. If it is already owned by another thread, the requesting thread is blocked. A thread can use the TryEnterCriticalSection function to request ownership of a critical section, without blocking upon failure to obtain the critical section. After it receives ownership, the thread is free to use the protected resource. The execution of the other threads of the process is not affected unless they attempt to enter the same critical section.
The WaitForInputIdle function makes a thread wait until a specified process is initialized and waiting for user input with no input pending. Calling WaitForInputIdle can be useful for synchronizing parent and child processes, because CreateProcess returns without waiting for the child process to complete its initialization. For more information, see Synchronization.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Синхронизация Выполнения Многочисленной Резьбы
Чтобы избегать расовых условий и тупиков, необходимо должно синхронизировать доступ многочисленной резьбой на распространившее ресурсы. Синхронизация также необходима проверять, что взаимозависимый код выполнен в соответствующей последовательности.
Win32 API Обеспечивает множество объектов чьи ручки могут быть использованы, чтобы синхронизировать многочисленную резьбу. Эти объекты включают:
Входные буферы Консоли События Mutexes Процессы Семафоры Резьба Таймеры
Состояние каждого из этих объектов - или сигнализировано или не было сигнализировано. Когда Вы определяете ручку на любой из этих объектов на вызове в одну из функций ожидания, выполнение вызывающей резьбы заблокировано пока состояние определенного объекта не станет сигнальным. Некоторые из них объекты полезные в блокировке резьбы пока некоторый случай не произойдет. Например, консольная входная буферная ручка сигнализирована когда есть unread вклад, как например, нажатие клавиши или щелчок кнопки мыши. Процесс и ручки резьбы сигнализированы когда процесс или резьба завершается. Это допускает процесс, например, чтобы создавать процесс ребенка затем блокировать свое собственное выполнение пока новый процесс не завершился.
Другие объекты полезные в защите распространившей ресурсы из одновременного доступа. Например, кратное заправляет может каждый имеет ручку на объекте mutex. Перед доступом коллективного ресурса, резьба должна назвать одну из функций ожидания, чтобы ждать состояние mutex, чтобы быть сигнализированн. Когда mutex становится сигнальным, только один ожидая резьбу выпущен, чтобы иметь доступ к ресурсу. Состояние mutex немедленно восстановлено, чтобы не сигнализированное, так что любое другое ожидание резьбы остается блокированным. Когда резьба завершена ресурсом, она должна установить состояние mutex на сигнализированное, чтобы позволять резьбу, чтобы иметь доступ к ресурсу.
Для резьбы единственного процесса, критическая секция объектов обеспечивают более эффективные средства синхронизации чем mutexes. Критическая секция использована подобно mutex, чтобы приспосабливаться один резьба от до использование защищенный ресурс. Резьба может использовать функцию EnterCriticalSection, чтобы просить собственность на критическую секцию. Если это уже принадлежащее другой резьбе, просящая резьба заблокирована. Резьба может использовать функцию TryEnterCriticalSection, чтобы просить собственность на критическую секцию, не блокируясь в неудаче получать критическую секцию. После того, как это получит собственность, резьба свободна, чтобы использовать защищенный ресурс. Выполнение другой резьбы процесса не воздействовано если они не пытаются вводить ту же критическую секцию.
Функция WaitForInputIdle делает, резьба ожидается пока определенный процесс не будет инициализирован и ждя ввод пользователя без входного рассматривать. Вызов WaitForInputIdle может быть полезным для синхронизирующих родительских и процессов ребенка, поскольку возврат CreateProcess не ждя процесс ребенка, чтобы завершать свою инициализацию. Более подробно, смотри Синхронизацию.
|
|
|
|
| |