7
votes

Quelqu'un peut-il expliquer Mutex et comment il est utilisé?

J'ai lu quelques documents sur Mutex et toujours la seule idée que j'ai obtenue, c'est qu'il aide à empêcher les threads d'accéder à une ressource déjà utilisée par une autre ressource.

J'ai reçu de l'extrait de code et exécuté qui fonctionne bien : P>

#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: %d\n", GetLastError() );
    }
    else if ( GetLastError() == ERROR_ALREADY_EXISTS )
        printf("CreateMutex opened existing mutex\n");

    else
        printf("CreateMutex created new mutex\n");

}


1 commentaires

Votre code de code semble incomplet, par ex. Je ne peux pas voir où la fonction de fonctionnalité est appelée. Pouvez-vous fournir plus et où l'avez-vous obtenu? Il serait également utile que vous avez clarifié si votre question concerne les mutiles en général ou cet extrait de code particulier.


4 Réponses :


1
votes

Peut-être que ce sera la meilleure source pour vous

http://fr.wikipedia.org/wiki/mutual_exclusion


0 commentaires

0
votes

Vous pouvez renvoyer ce message pour la comparaison de divers mécanismes de synchronisation de thread. Différence entre les verrous, les moutons et les sections critiques

Si vous voulez des informations spécifiques, Mutex, alors Wikipedia vous donnera suffisamment de détails.


0 commentaires

12
votes

Un mutex fournit mut ually ualement ex d'accès à une ressource; Dans votre cas, une base de données. Il n'y a pas de threads multiples dans votre programme, mais vous pouvez avoir plusieurs instances de votre programme en cours d'exécution, ce que votre mutex protège contre. Efficacement, il protège toujours contre l'accès de plusieurs threads, c'est que ces threads peuvent être dans des processus distincts.

Votre code crée un nommé mutex qui peut être partagé sur plusieurs instances de votre application. Ceci est une forme de communication interprocession. Documentation MSDN sur Createmutex a des informations utiles supplémentaires sur les mutexs nommés:

Deux processus ou plus peuvent appeler Createmutex pour créer le même nommé mutex. Le premier processus en fait crée le mutex et suivant Processus avec un accès suffisant les droits ouvrent simplement une poignée à la MuTex existant ...

Les processus multiples peuvent avoir des poignées de le même objet mutex, permettant l'utilisation de L'objet d'interprocession synchronisation.

Un mutex n'est nécessaire que si la base de données que vous travaillez contre n'atteignez pas intrinsèquement l'accès multithreadisé.


0 commentaires

0
votes

Ce lien dans MSDN fournit Un exemple similaire que le vôtre avec des threads fabriqués dans la fonction principale (). Mais à nouveau, la ressource partagée, censée être une base de données n'est pas incluse.
Quoi qu'il en soit, une ressource partagée est tout ce qui doit être accessible à partir de plusieurs threads: ModèlesFiles, pilotes, bases de données, ...

L'esprit que vous voulez que le compteur dans l'exemple est écrit lorsqu'il est protégé par le mutex, alors qu'il est lu sans être protégé. Dans ce cas, il n'y a probablement aucun problème, c'est un peu bâclé.


0 commentaires