Может кто-нибудь объяснить мьютекс и как он используется?

Я прочитал несколько документов о Мьютексе, и все же единственная идея, которую я получил, - это то, что он помогает предотвратить доступ потоков к ресурсу, который уже используется другим ресурсом.

Я получил из фрагмента кода и выполнил, который отлично работает:

#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 для создания того же имени взаимное исключение. Первый процесс на самом деле создает мьютекс, и последующие процессы с достаточным доступом права просто открывают дескриптор существующий мьютекс...

несколько процессов могут иметь ручки тот же объект мьютекса, позволяющий использовать объект для взаимодействия процессов синхронизация.

мьютекс необходим только в том случае, если база данных, с которой вы работаете, не поддерживает многопоточный доступ.


может быть, это будет лучший источник для вас

http://en.wikipedia.org/wiki/Mutual_exclusion


этой ссылке в msdn приведен аналогичный пример с потоками, выполненными в функции main (). Но опять же общий ресурс, который должен быть базой данных, не включен.
Во всяком случае, общий ресурс-это все, что нужно получить из нескольких потоков: settingsfiles, drivers, database,...

имейте в виду, что счетчик в Примере написан, защищенный мьютексом, в то время как он был прочитан, не будучи защищенным. В то время как в в этом случае, вероятно, нет проблем, это немного небрежно.


вы можете сослаться на это сообщение SO для сравнения различных механизмов синхронизации потоков разница между блокировками, мьютексом и критическими разделами

Если вы хотите конкретную информацию мьютекс, то Википедия даст вам достаточно деталей.