|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Using Mutex Objects
You can use a mutex object to protect a shared resource from simultaneous access by multiple threads or processes. Each thread must wait for ownership of the mutex before it can execute the code that accesses the shared resource. For example, if several threads share access to a database, the threads can use a mutex object to permit only one thread at a time to write to the database.
In the following example, a process uses the CreateMutex function to create a named mutex object or open a handle of an existing mutex object.
HANDLE hMutex;
// Create a mutex with no initial owner.
hMutex = CreateMutex( NULL, // no security attributes FALSE, // initially not owned "MutexToProtectDatabase"); // name of mutex
if (hMutex == NULL) { // Check for error. }
When a thread of this process writes to the database, as in the next example, it first requests ownership of the mutex. If it gets ownership, the thread writes to the database and then releases its ownership. The example uses the try-finally structured exception-handling syntax to ensure that the thread properly releases the mutex object. The finally block of code is executed no matter how the try block terminates (unless the try block includes a call to the TerminateThread function). This prevents the mutex object from being abandoned inadvertently.
BOOL FunctionToWriteToDatabase(HANDLE hMutex) { DWORD dwWaitResult;
// Request ownership of mutex. dwWaitResult = WaitForSingleObject( hMutex, // handle of mutex 5000L); // five-second time-out interval switch (dwWaitResult) { // The thread got mutex ownership. case WAIT_OBJECT_0: try { // Write to the database. }
finally { // Release ownership of the mutex object.
if (! ReleaseMutex(hMutex)) { // Deal with error. }
break; }
// Cannot get mutex ownership due to time-out. case WAIT_TIMEOUT: return FALSE;
// Got ownership of the abandoned mutex object. case WAIT_ABANDONED: return FALSE; }
return TRUE; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Использование Mutex Возражает
Вы можете использовать объект mutex против защищать коллективный ресурс из одновременного доступа многочисленной резьбой или процессами. Каждая резьба должна подождать собственность на mutex прежде, чем она может выполнить код, который имеет доступ к коллективному ресурсу. Например, если несколько резьбы распространяют доступ к базе данных, резьба может использовать объект mutex против разрешения только один резьба от до запись базе данных.
В следующем примере, процесс использует функцию CreateMutex, чтобы создавать поименованный mutex возражать или открывать ручку существующего mutex объекта.
ПРООПЕРИРУЙТЕ hMutex;
// Создайте mutex без начального владельца.
hMutex = CreateMutex( НЕДЕЙСТВИТЕЛЬНАЯ, // никакая безопасность не приписывает ЛОЖЬ, // первоначально не собственное "MutexToProtectDatabase"); // имя mutex
если (hMutex == НЕДЕЙСТВИТЕЛЬНЫЙ) { // Чек ошибки. }
Когда резьба этого процесса записывается базе данных, как в следующем примере, она сначала запрашивает собственность на mutex. Если это получает собственность, резьба записывается базе данных и тогда выпускает свою собственность. Пример использует пытаться-исключительную обработку наконец структурного синтаксиса, чтобы проверять, что резьба правильно выпускает объект mutex. Наконец блок кода выполнен независимо от того, как пробовать блока не завершает (если пробовать блока не включает вызов в функцию TerminateThread). Это предохраняет объект mutex от покинутое неумышленно.
BOOL FunctionToWriteToDatabase(РУЧКА hMutex) { DWORD dwWaitResult;
// Собственность Запроса на mutex. dwWaitResult = WaitForSingleObject( hMutex, // РУЧКА mutex 5000L); // пять-секунда задерживают интервал ключ (dwWaitResult) { // Резьба получала mutex собственность. случай WAIT_OBJECT_0: попытка { // Запись базе данных. }
наконец { // Собственность Версии на объект mutex.
если (! ReleaseMutex(hMutex)) { // СДЕЛКА с ошибкой. }
прерывание; }
// Не может получить mutex собственность из-за задержки. случай WAIT_TIMEOUT: обратная ЛОЖЬ;
// Получите собственность на заброшенный mutex объект. случай WAIT_ABANDONED: обратная ЛОЖЬ; }
возвращайтесь ВЕРНО; }
|
|
|
|
| |