2 Stimmen

CreateMutex() und OpenMutex() geben unterschiedliche Handles zurück

Ich denke, die beiden Funktionen geben dasselbe Kernel-Handle zurück. Und ich schreibe ein Testprogramm, um meine Ansicht zu beweisen:

In meinem Programm erstelle ich ein Kernel-Handle mit dem Namen '_MYTEST'.

hHandle1 = CreateMutex(NULL, false, _T("_MYTEST"));

dann starte ich einen Thread und öffne das Handle oben in diesem Thread mit folgendem Code:

hHandle2 = OpenMutex(MUTEX_ALL_ACCESS, false, _T("_MYTEST"));

Wenn ich das Programm ausführe, stelle ich fest, dass die beiden Rückgabewerte nicht gleich sind! Der Wert von hHandle2 ist 4 größer als der Wert von hHandle1. Gibt es irgendwelche Probleme in meinem Code? Wenn nicht, warum sind die beiden Werte nicht gleich?

3voto

Mahmoud Al-Qudsi Punkte 26972

Ein Handle ist nicht das Objekt, sondern ein im Kernel gespeicherter Deskriptor, der einen nur im Adressraum Ihres Programms gültigen Wert einem Kernelobjekt zuordnet.

Das ist der lange Weg zu sagen: ein Handle auf den Mutex ist nicht der Mutex selbst. Nur weil die Handles unterschiedlich sind, bedeutet das nicht, dass die Mutexe darunter auch unterschiedlich sind.

Das ist so, als würde man in C zwei verschiedene Zeiger auf ein Objekt erstellen und dann die Adressen der Zeiger (im Vergleich zum Inhalt des Zeigers), um fälschlicherweise zu folgern, dass die Objekte nicht dieselben sind.

0voto

paxdiablo Punkte 809679

Dies funktioniert wie geplant. Der "Verbindungspunkt" der Semaphore liegt auf einer niedrigeren Ebene als das Handle, das von CreateMutex o OpenMutex .

Mit anderen Worten, entweder Handle auf denselben zugrunde liegenden Mutex verweisen, der durch den Namen (Ihr drittes Argument) angegeben wird.

Das sehen Sie, wenn Sie jeden Thread sein jeweiliges Handle sperren lassen, eine Nachricht ausgeben, zehn Sekunden warten und es dann wieder entsperren.

Einer der Threads wird nichts drucken, bis der andere seine Sperre aufhebt und die zweite Sperre fortgesetzt werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X