2 Threads gleichzeitig starten und im main Programm erst weitermachen wenn beide beendet sind
-
Welchen Vorteil hat das?
-
_beginthread schließt selbstständig das Threadhandle, wenn der Thread zum Ende kommt. Wenn er ganz schnell ist, ist möglicherweise das zurückgegebene Handle schon ungültig, wenn der Aufrufer es bekommt, oder im schlimmsten Fall anderweitig vergeben.
Threads, die mit CreateThread gestartet werden, können dagegen Speicher- und Ressourcenlecks hinterlassen, wenn bestimmte Funktionen aus der C-Runtime - Bibliothek aufgerufen werden. Wenn man sich sicher ist, dass diese nicht vom erstellten Thread benutzt werden, ist CreateThread genauso gut wie _beginthreadex.
Aber mit _beginthreadex vermeidet man von vornherein alle Probleme.Wenn man das Handle gar nicht benötigt, ist _beginthread aber auch okay. Diese beiden beschaffen sich für den Thread für die kritischen C-Runtime - Funktionen threadlokalen Speicher, den sie auch wieder aufräumen, das macht CreateThread nicht.
-
Belli schrieb:
Wenn man das Handle gar nicht benötigt, ist _beginthread aber auch okay. Diese beiden beschaffen sich für den Thread für die kritischen C-Runtime - Funktionen threadlokalen Speicher, den sie auch wieder aufräumen, das macht CreateThread nicht.
Das von _beginthreadex erhaltene Handle sollte man mit CloseHandle schließen, so wie auch das, welches man von CreateThread bekommt.
-
Hey,
schonmal danke und sry für die späte Antwort.
Das mit den Threads synchronisieren habe ich hinbekommen.
Jedoch stellt sich noch das Problem der Kernzuweisung.
Mit
_beginthread(Thread1,0,NULL);
SetThreadAffinityMask(Thread1,1);kann ich die Threads Kernen zuweisen jedoch denke ich das das Problem ist das der Thread sofort startet und die zuweisung zu spät bzw garnicht geschieht wenn ich das direkt danach mache im main programm mache.
kann ich den thread irgendwie erstellen und erst später starten?
-
initflag
Initial state of a new thread (0 for running or CREATE_SUSPENDED for suspended); use ResumeThread to execute the thread.http://msdn.microsoft.com/de-de/library/kdzttdcb(v=vs.80).aspx
-
hey,
schonmal vielen dank!
jedoch habe ich gerade leichte probleme mit was nun handle ist und was nicht komme irgendwie gerade voll durcheinander könntest du mir nen kleines beispielprogramm geben wo du einfach nen thread erstellst ihn dann einem kern zuordnest und dann startest? sry ich weiß klingt so ein bisschen so als wenn ich die arbeit auf dich abwälze dies ist aber absolut nicht mein ziel habe das gerade länger versucht und habe irgendwie immer fehler.
schonmal danke im vorraus !
-
Beispiele für Threaderstellung findest du auf der verlinkten Seite weiter unten.
-
user5123 schrieb:
Jedoch stellt sich noch das Problem der Kernzuweisung.
Mit
_beginthread(Thread1,0,NULL);
SetThreadAffinityMask(Thread1,1);kann ich die Threads Kernen zuweisen jedoch denke ich das das Problem ist
1. Welches Problem tritt denn dabei auf?
2. Warum lässt Du nicht das System die Threads selbst verteilen?
-
hMutex=CreateMutex(NULL,FALSE,NULL); _beginthread(Thread1,4096,&x); hMutex1=CreateMutex(NULL,FALSE,NULL); _beginthread(Thread2,4096,&y);
2 Mutex für 2 Threads ist Nonsens.
Außerdem gehört dieses Gefrickel ins WinAPI Subforum.
-
für SetThreadAffinityMask benötigst du ein WinAPI HANDLE, das bekommst du z.B. im Thread selber mit GetCurrentThread(), d.h. SetThreadAffinityMask(GetCurrentThread(),...);