Mutex
-
Hallo,
wie genau wende ich Mutex an??
Ich habe mir überleg ein Mutex mit dieser Funktion zu erstellen:WaitForSingleObject(CreateMutex(NULL, true, "ThreadAnz"), INFINITE);Doch wenn ich diese Funktion wieder aufrufe läuft das Programm einfach weiter, ohne in der WaitFor... Funktion zu warten.
Was genau mache ich falsch?
Also ich möchte, dass sobald ein Mutex existiert und ein Weiterer mit den gleichen Namen erstellt werden soll, dass dann das Programm in der Funktion WaitFor... stehen bleiben soll.
-
ReleaseMutex() vergessen?
--> http://msdn2.microsoft.com/en-us/library/ms686927.aspx
btw: so wie du's machst wird immer eine neues handle erzeugt. das ist ziemlich ungünstig.
am besten einmal nur 'CreateMutex()' aufrufen und dann 'WaitForSingleObject()/ReleaseMutex()' mit dem selben handle.

-
Und freigeben würd' ich die Dinger auch irgendwann wieder...
p.S.: hihi, freigeben kann man ja als ReleaseMutex() interpretieren wie mir gerade auffällt. Ich meine natürlich freigeben wie in CloseHandle().
-
Ok, vielen Dank!
Das werde ich gleich sofort mal antesten!
-
TheCaleb schrieb:
Hallo,
wie genau wende ich Mutex an??
Ich habe mir überleg ein Mutex mit dieser Funktion zu erstellen:WaitForSingleObject(CreateMutex(NULL, true, "ThreadAnz"), INFINITE);Doch wenn ich diese Funktion wieder aufrufe läuft das Programm einfach weiter, ohne in der WaitFor... Funktion zu warten.
Was genau mache ich falsch?
Also ich möchte, dass sobald ein Mutex existiert und ein Weiterer mit den gleichen Namen erstellt werden soll, dass dann das Programm in der Funktion WaitFor... stehen bleiben soll.Diese Objekte blockieren nur, wenn Sie aus unterschiedlichen Threads ausgeführt werden! Werden Sie aus dem selben Thread ausgeführt passiert gar nichts, denn Du bist ja der Owner!
Wenn Du das aus einem Thread möchtest, dann würde ich Dich jetzt fragen: Wer löst die Blockade wieder auf?
ReleaseMutex hat damit gar nichts zu tun, das es nicht blockiert. Aber aufrufen sollte man diese Funktion schon. Also solltest Du auch das Handle speichern!
Bzw. OpenMutex verwenden um an einen bestehenden Mutex heranzukommen.
Zudem würde ich den Namen schon etwas komplizierter gestalten. Der gilt systemweit.
-
Also wenn ich
WaitForSingleObject(Mutex, INFINITE);schreibe, dann ist der Mutex für den jeweiligen Thread owner und wenn ich ihn dann mit
ReleaseMutex(Mutex);wieder freigebe, dann kann ein anderer Thread owner davon werden, ansonsten würde der Thread in der WaitFor... Funktion warten oder vertuh ich mich da??
-
Lies doch die Doku.
Du hast den Mutex als Onwer angelegt mit CreateMutex (zweite Parameter TRUE). Der Mutex wurde also erzeugt und sofort das Eigentum des aktuellen Threads.
Also ist ein Wait unnötig.Wenn ein Thread den Mutex nicht besitzt, kann er diesen mit WaitForSingleObject erhalten.
Ein Thread der Owner eines Mutex ist muss diesen mit ReleaseMutex freigeben, damit andere darauf zugreifen können!
Brauchst Du eigentlich einen Mutex? Langt nicht evtl. eine Critical Section?
-
Ist ok, danke!
Mehr wollte ich nicht wissen!
-
vorsicht mit critical sections, versuchs lieber eventgesteuert und mit synchronize() eh du in einer threadmethode mit CS arbeitest, in windows vista wird das sonst zum stolperstein.
-
Ceos schrieb:
vorsicht mit critical sections, versuchs lieber eventgesteuert und mit synchronize() eh du in einer threadmethode mit CS arbeitest, in windows vista wird das sonst zum stolperstein.
Bitte wie? Kannst Du das erklären.
Was hat sich bitte in Vista hier geändert? Links auf die Specs bitte!
Was meinst Du mit Synchronize? Das ist IMHO keine Win32 API Funktion.CS sind immer noch der einfachste Weg gesharte Daten zu blocken für den Schreib/Lesezugriff. Mutexe und Events sind hier viel zu langsam und hinderlich.
-
Gibt es bei CS auch so eine Art WaitFor Funktion, die ein Wartezustand erzeugt, der wenig CPU Last erzeugt??
-
EnterCriticalSection wartet bis die CS frei wird (natürlich i.d.R. ohne CPU-Last)
-
Danke!