Может кто-нибудь объяснить мьютекс и как он используется?
Я прочитал несколько документов о Мьютексе, и все же единственная идея, которую я получил, - это то, что он помогает предотвратить доступ потоков к ресурсу, который уже используется другим ресурсом.
Я получил из фрагмента кода и выполнил, который отлично работает:
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
BOOL FunctionToWriteToDatabase(HANDLE hMutex)
{
DWORD dwWaitResult;
// Request ownership of mutex.
dwWaitResult = WaitForSingleObject(
hMutex, // handle to 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;
}
void main()
{
HANDLE hMutex;
hMutex=CreateMutex(NULL,FALSE,"MutexExample");
if (hMutex == NULL)
{
printf("CreateMutex error: %dn", GetLastError() );
}
else if ( GetLastError() == ERROR_ALREADY_EXISTS )
printf("CreateMutex opened existing mutexn");
else
printf("CreateMutex created new mutexn");
}
но я не понимаю, где находится поток и где находится общий ресурс? Может ли кто-нибудь объяснить или предоставить лучшую статью или документ?
4 ответов
мьютекс обеспечивает Мутually exобнаруженные доступ к ресурсу; в вашем случае, база данных. В вашей программе нет нескольких потоков, но у вас может быть несколько экземпляров вашей программы, от чего защищает ваш мьютекс. Фактически, он по-прежнему защищает от доступа из нескольких потоков, просто эти потоки могут быть в отдельных процессах.
ваш код создает имени мьютекс, который может совместное использование нескольких экземпляров приложения. Это форма межпроцессного общения. Документация MSDN на CreateMutex
имеет дополнительную полезную информацию об именованных мьютексах:
два или более процессов могут позвонить CreateMutex для создания того же имени взаимное исключение. Первый процесс на самом деле создает мьютекс, и последующие процессы с достаточным доступом права просто открывают дескриптор существующий мьютекс...
несколько процессов могут иметь ручки тот же объект мьютекса, позволяющий использовать объект для взаимодействия процессов синхронизация.
мьютекс необходим только в том случае, если база данных, с которой вы работаете, не поддерживает многопоточный доступ.
этой ссылке в msdn приведен аналогичный пример с потоками, выполненными в функции main (). Но опять же общий ресурс, который должен быть базой данных, не включен.
Во всяком случае, общий ресурс-это все, что нужно получить из нескольких потоков: settingsfiles, drivers, database,...
имейте в виду, что счетчик в Примере написан, защищенный мьютексом, в то время как он был прочитан, не будучи защищенным. В то время как в в этом случае, вероятно, нет проблем, это немного небрежно.
вы можете сослаться на это сообщение SO для сравнения различных механизмов синхронизации потоков разница между блокировками, мьютексом и критическими разделами
Если вы хотите конкретную информацию мьютекс, то Википедия даст вам достаточно деталей.