2 Threads gleichzeitig starten und im main Programm erst weitermachen wenn beide beendet sind
-
Hey,
Ich arbeite an einer Zeitauswertung eines Sobels und habe leichte Probeleme dabei die Threads vollständig ausführen zulassen und dann erst im main program weiterzuarbeiten. den vertikalen und horizontalen sobel lasse ich jeweils in einem thread abarbeiten. jedoch warten mein main programm nicht bis diese fertig sind.
Ich arbeite damit mit Mutex:
main: x=0,y=1
hMutex=CreateMutex(NULL,FALSE,NULL);
_beginthread(Thread1,4096,&x);
hMutex1=CreateMutex(NULL,FALSE,NULL);
_beginthread(Thread2,4096,&y);threads:
void Thread1( void *pMyID )
{
printf("Starte Thread Nr.%d\n",x);WaitForSingleObject(hMutex,INFINITE);
ProzessA(); //Berechnung Sobel
ReleaseMutex(hMutex);
printf("Beende Thread Nr.%d\n",x);
_endthread();
}
void Thread2( void *pMyID )
{
printf("Starte Thread Nr.%d\n",y);WaitForSingleObject(hMutex1,INFINITE);
ProzessB(); //Berechnung Sobel
ReleaseMutex(hMutex1);
printf("Beende Thread Nr.%d\n",y);
_endthread();
}nun bin ich mir nicht sicher wie ich in main abfrage das der mutex wieder freigegeben ist und das programm weiterarbeitet.
schonmal danke im vorraus
-
Anstatt von _beginthread nimm CreateThread.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx
Diese Funktion liefert dir ein Handle, für deine beiden Threads bekommst du je ein Handle zurück und im main Programm wartest du dann mit WaitForSingleObject(2 mal aufrufen mit je einem Handle und INFINITE als zweiten Parameter), bis die Threads fertig sind.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
Für mehrere Threads könnte auch
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx
interessant sein.Btw.
Hast du in deinem Programm noch andere Threads, die ProzessA() oder ProzessB() aufrufen? Wenn nicht und wenns dir nur ums Warten geht, dann kannst du die Mutexe rausschmeißen, denn dann sind sie wirkungslos.
-
Nimm nicht CreateThread, nimm stattdessen _beginthreadex
-
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(),...);