2012-03-26 5 views
1

Zuerst habe ich es getestet und es hat gut funktioniert. Ich möchte wissen, ob es korrekt ist oder nicht.Ist es sicher, "throw" ohne Mutex in win32 zu verwenden?

funcA() { 
    DWORD res = WaitForSingleObject(mutex, INFINITE); 
    if (aaa != bbb) throw "aaa"; 

    ReleaseMutex(mutex); 
} 

WaitForSingleObject gibt immer "0", nicht "WAIT_ABANDONED" oder andere Fehlercodes. Ich kann einfach keine Dokumentation finden, die beschreibt, dass Mutex auf "throw" veröffentlicht würde.

Danke

+0

Wenn Sie funcA() aus demselben Thread fortlaufend aufrufen, ist dies das erwartete Verhalten - WAIT_OBJECT_0 wird zurückgegeben, da Windows-Mutexe rekursiv sind. Wenn Sie funcA() von einem anderen Thread das zweite Mal aufrufen, würde ich erwarten, dass der Aufruf blockiert wird, bis der erste Thread den Mutex freigibt. –

+0

Sie haben Recht. Ich benutze die xmlrpc-Bibliothek und dachte, dass es mehrere Threads für die Bearbeitung der Anfrage gibt, aber es gibt nur einen Thread. Also, es wurde erwartet, Verhalten und mein Mutex ist unnötig! :) – Sean

Antwort

1

Nein, wird der Mutex nicht auf throw loslassen werden.

Sie können jedoch Ihre eigene Lock Klasse erstellen, die den Mutex für den Konstruktor sperrt und ihn auf seinem Destruktor freigibt. Wenn Sie in Ihrer Funktion ein Lock Objekt verwenden (indem Sie den Speicherstapel und nicht den Heap verwenden), können Sie sicherstellen, dass der Destruktor für dieses Objekt aufgerufen und der Mutex freigegeben wird.

Dies ist genau das, was die Klasse in MFC macht.

+1

Auch CComAutoCriticalSection und CComCriticalSectionLock in ATL. – selbie

1

Es wird nicht, es sei denn, die Freigabe wird implizit im Destruktor oder Catch-Block aufgerufen. Zeigen Sie den gesamten Code, der für die Beschreibung benötigt wird?