Probleme mit Threads und Mutexen.
-
Ich habe eine Problem mit threads und Mutexn.
In einer Unterroutine (SendeDaten) werden einige Aktionen über eine Mutex geschützt (timeout Zeit 10 Sekunden, Verweildauer in den gesamten routine unter 10 mSek, d.h der Timout ist 10exp4 größer als die benötigte Zeit, sollte auch in Windows reichen).
Wenn ich diese Routine aus dem Hauptprogramm heraus aufrufe funktioniert es einwandfrei, ich bekomme den Mutex.
Wenn ich diese Routine aus einem thread heraus aufrufe läuft der Timeout aus.
Zur Zeit gibt es niemanden im Programm der mit meiner Routine um den Mutex konkurriert. Während des threads ruft kein anderer diese Routine auf.
threadfunktion VOID PAD(PVOID pvoid) { SendeDaten(); } Folgender Ablauf: Mainprogramm SendeDaten() ok _beginthread(PAD,0,NULL); timeout nach 10 Sekunden Sleep(15000); SendeDaten() ok
Diese Sequenz kann in allen möglichen Anordnungen wiederholen, das Ergebnis bleibt das gleiche.
Bin derzeit ratlos, habe sowohl schon reichlich mit threads,Mutexen, Semaphoren und Events geabeitet und hatte nie solche Probleme.
Wenn irgend jemand eine Idee hat, ich wäre für Anregungen sehr dankbar.
-
Der Aufruf von ReleaseMutex findet ganz einfach nicht statt. Dadurch kann der Thread nicht Owner werden und Du läufst ins Timeout.
-
Gute Idee habs überprüft der zugehörige ReleaseMutex findet leider statt, wäre zu schön gewesen
Danke
-
Aber scheinbar nicht oft genug. Wie hast Du Dein Mutex denn erzeugt, mit TRUE für den zweiten Parameter? Wenn ja, gibt es dazu auch ein ReleaseMutex?
-
Dein Verdacht bezüglich der fehlenden releases muß ich erst noch prüfen.
Allerdings bleibt bei mir die Frage wenn ich die Routine aus dem Programm main thread starte funktionieren sie einwandfrei, wenn ich aber eine Thread abspalte un dieselbe Funktion aufrufe gehts daneben.
Wenn ich danach wieder die funktion aus dem main thread aufrufe funktioniert sie und das auch hunderte Male, in einem abgespalteten thread nie.
Wie soll ich das mit den vielleicht fehlendem release mutex in Einklang bringen.
-
Schkließe mich King an - das ist genau das Verhalten, das du bekommst, wenn der Main Thread den Mutex (noch) hat.
-
PAD schrieb:
Wenn ich danach wieder die funktion aus dem main thread aufrufe funktioniert sie und das auch hunderte Male, in einem abgespalteten thread nie.
Wenn der Main-Thread einmal Owner ist, kann er auch mehrere Male das Mutex anfordern (auch hunderte Male):
MSDN schrieb:
After a thread obtains ownership of a mutex, it can specify the same mutex in repeated calls to the wait-functions without blocking its execution. This prevents a thread from deadlocking itself while waiting for a mutex that it already owns.
Für jede Anforderung muß es aber auch ein Release geben, sonst sieht der andere Thread, wie auch bei Dir, keine Sonne.
-
Danke
Noch mal konkret die Frage. wenn ich im Haptthread den Mutex 2 mal anfordere, muß ich ihn dann auch zweimal releasen.int fkt() { WaitforSingle.. (handle1...); printf("Got Mutex first time\"); WaitforSingle.. (handle1...); printf("Got Mutex second time\"); Release... Release... }
Ja ich weis, das man es so im normalen Programm schreibt ist schwachs..., es dient nur der Verdeutlichung.
-
PAD schrieb:
Noch mal konkret die Frage. wenn ich im Haptthread den Mutex 2 mal anfordere, muß ich ihn dann auch zweimal releasen.
Das liest sich eher wie eine Feststellung, ist aber richtig. Dazu gleich noch ein kleines Zitat aus dem MSDN:
MSDN schrieb:
To release its ownership under such circumstances, the thread must call ReleaseMutex once for each time that the mutex satisfied the conditions of a wait function.
-
Danke
Das scheints zu sein wir warten zweimal auf den Mutex haben aber nur einen Release. Jetzt erstmal die richtige Stelle für den zweiten Release finden und
dann testen.Da ihr euch mit dem Thema auskennt, gibt es irgendeine Möglichkeit eine Liste aller (benamten) Mutexe, Semaphoren, Events auf einem NT-System zu bekommen, und auf dem Rechner darzustellen ? Besonders Toll währe es wenn man noch den Zustand (Snapshot) dazubekommen würde.
-
Eine Liste der Objekte:
http://www.sysinternals.com/ntw2k/freeware/winobj.shtmlMit wesentlich mehr Ordnung, Such-Funktion und noch einiges mehr:
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml
-
Klasse, scheint interessant zu sein. Probiers aus sobald ich Zeit habe, zur Zeit habe ich ein Termin Projekt das mich täglich vpn 6 bis 20 Uhr beschäftigt.
Deshalb auch noch mal vielen Dank für die Hilfe
Edit:
Danke für den Tip mit SysInternals, hatte dort zu lange nicht mehr nachgeschaut. die beiden Tools sind gut.