threads - eigenes handle und id herausfinden
-
Hallo,
wenn ich mit
temphandle=CreateThread(NULL, 0, schlagmichtot, ¶m, 0, &tempid);einen neuen Thread starte, kann ich dann innerhalb des Threads die eigene Id (hier in tempid) und das eigene Handle (hier in temphandle) herausfinden?
Bisher packe ich das in den Parameter und übergebe das dem Thread, aber vielleicht kann ich mir das ja sparen....
Gruss
R
-
die id kriegste mit 'GetCurrentThreadId()' als handle nimmste -1 oder 0xffffffff.
dann brauchste nix weiterzureichen
-
Das Handle brauche ich um woanders mittels WaitForSingleObject auf diesen Thread warten zu können.
Danke auf jeden Fall für GetCurrentThreadId().
Gruss
R
-
std::Robin schrieb:
Das Handle brauche ich um woanders mittels WaitForSingleObject auf diesen Thread warten zu können.
nimm dies: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getcurrentthread.asp
-
vielen Dank (Ich muss eben in der msdn blind gewesen sein.
)
-
std::Robin schrieb:
Das Handle brauche ich um woanders mittels WaitForSingleObject auf diesen Thread warten zu können.
Mit der ID kannst Du aber nicht warten! Du brauchst schon ein Handle!
Und ich pers. empfehle nicht aus der ID das Handle mittles "OpenThread" zu ermitteln.
Wenn Du das Handle doch schon hast (durch CreateThread), dann kannst Du doch auch dieses an beliebigen anderen Stellen verwenden um darauf zu warten...
-
Jochen Kalmbach schrieb:
Und ich pers. empfehle nicht aus der ID das Handle mittles "OpenThread" zu ermitteln.
geht aber auch.
-
net schrieb:
Jochen Kalmbach schrieb:
Und ich pers. empfehle nicht aus der ID das Handle mittles "OpenThread" zu ermitteln.
geht aber auch.
Wie gesagt, ich empfehle es nicht. Der Grund:
Es geht nur "zuverlässing", wenn zwischen einem möglichen Ende des Threads und dem Öffnen mit "OpenThread" eine "kurze" Zeit liegt. Liegt ein "längerer" Zeitraum dazwischen, so kann die ID schon von einem anderen Thread wiederverwendet worden sein.
Also 100% zuverlässig geht es nur, wenn man sicher ist, das der Thread noch läuft. Falls dies unsicher ist, rate ich davon ab.
-
Ok, Openthread werde ich nicht benutzen...
//...irgendwo in der main... DWORD tempid; HANDLE temphandle; temphandle=CreateThread(NULL, 0, schlagmichtot, ncd, 0, &tempid); //Ab hier läuft der workerthread schon, jedoch die "richtigen" Variablen noch nicht zugewesen handles_guard.LockWriter(); handles[id]=temphandle; handles_guard.UnlockWriter(); threads_guard.LockWriter(); threads[tempsock]=tempid; threads_guard.UnlockWriter();Das Problem ist, dass ich mit dem Füllen der Tempvariablen den Thread schon gestartet habe, und die Tempvariablen noch nicht in den endgültigen Variabalen (vektoren, maps) gespeichert sind. Im ungüstigsten Fall greift der Workerthread schon darauf zu und findet sich selbst nicht, bzw verpasst etwas, da er von anderen Threads als nichtexistent angesehen wird.
Daher dachte ich, ich lasse den Workerthread sich selbst eintragen, dann kann ich ganz sicher sein.
-
Jochen Kalmbach schrieb:
net schrieb:
Jochen Kalmbach schrieb:
Und ich pers. empfehle nicht aus der ID das Handle mittles "OpenThread" zu ermitteln.
geht aber auch.
Wie gesagt, ich empfehle es nicht. Der Grund:
Es geht nur "zuverlässing", wenn zwischen einem möglichen Ende des Threads und dem Öffnen mit "OpenThread" eine "kurze" Zeit liegt. Liegt ein "längerer" Zeitraum dazwischen, so kann die ID schon von einem anderen Thread wiederverwendet worden sein.ich meinte sowas:
HANDLE hthread = OpenThread (THREAD_ALL_ACCESS, FALSE, GetCurrentThreadId());das gibt ein richtiges handle, nicht so'n 'fakehandle' wie man's von 'GetCurrentThread()' bekommt
-
Da kannst Du auch DuplicateHandle verwenden...
HANDLE hThread; if (DuplicateHandle( GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS ) == 0) { // failed... }
-
std::Robin schrieb:
Das Problem ist, dass ich mit dem Füllen der Tempvariablen den Thread schon gestartet habe, und die Tempvariablen noch nicht in den endgültigen Variabalen (vektoren, maps) gespeichert sind. Im ungüstigsten Fall greift der Workerthread schon darauf zu und findet sich selbst nicht, bzw verpasst etwas, da er von anderen Threads als nichtexistent angesehen wird.
Dann musst Du den Thread mit CREATE_SUSPENDED erzeugen und erst wenn alles initialisiert ist, diesen laufen lassen (ResumeThread)!