Seite 1 von 1

Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 16:21
von B.G.Michi
Hallo zusammen

ich bräuchte da mal einen erlösenden Denkanstoß im Bezug auf Multithreading...
In meinem Programm läuft in mehreren Threads eine Schleife in etwa dieser Form:

Code: Alles auswählen

while(!bEnd)
{
   // AUFGABE 1
   ...
   // AUFGABE 2
   ...
   // usw.
}
Nun möchte ich die Threads folgendermaßen synchronisieren:
Jeder Thread soll AUFGABE 1 bearbeiten und dann warten, bis auch alle anderen mit AUFGABE 1 fertig sind. Erst wenn alle mit AUFGABE 1 fertig sind sollen alle mit AUFGABE 2 weitermachen. Dann wieder warten und dann die Nächste usw. ...

Bin jetzt schon ne Weile am grübeln und versuchen aber komm auf keinen grünen Zweig...
Welches dieser "Synchronisationsobjekte" ist denn für dieses Problem überhaupt geeignet? (also Mutex, Event, Critical Section, ...)

auf jeden Fall schon mal vielen Dank :D
JFF_B.G.Michi

Re: Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 16:28
von dowhilefor
Eine Semaphore vielleicht? :)

Und noch ein Link

Re: Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 16:43
von Krishty
Zuerst jedem Thread ein Event „Hat Aufgabe 1 erledigt“ zuweisen.

Der Haupt-Thread benutzt WaitForMultipleObjects(), um auf die „Hat Aufgabe 1 erledigt“-Events aller Threads zu warten. Danach feuert er sein eigenes Event, „Dürfen Aufgabe 2 starten“.

Die Arbeiter-Threads arbeiten Aufgabe 1 ab und benutzen danach WaitForSingleObject(), um auf das „Dürfen Aufgabe 2 starten“-Event des Haupt-Threads zu warten. Dann führen sie Aufgabe 2 durch.

Je nachdem, wieviele Aufgaben du hast, kannst du die einzelnen Events wiederverwenden, statt für jede Aufgabe eins zu erzeugen.

Gruß, Ky

Dass ich mit dem Problem zu tun hatte ist schon ein bisschen her, darum gibt’s das ohne Gewähr. (Weihnachtszeit macht lyrisch.)

Re: Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 17:33
von B.G.Michi
Genial, vielen Dank für die "beinahe Instant"-Antworten :D
Krishtys Variante läuft wunderbar

für die Nachwelt... hier mal die Funktion, die vor jeder Aufgabe das warten übernimmt:

Code: Alles auswählen

	HANDLE* m_hCompletedEvent;
	HANDLE* m_hContinueEvent;

	void Simulation::WaitForOtherThreads(int _nID)
	{
		SetEvent(m_hCompletedEvent[_nID]);
		if(_nID==0)
		{
			WaitForMultipleObjects(m_nNumThreads,m_hCompletedEvent,TRUE,INFINITE);
			for(int x=0;x<m_nNumThreads;x++)
				SetEvent(m_hContinueEvent[x]);
		}
		WaitForSingleObject(m_hContinueEvent[_nID],INFINITE);
	}
auf euch ist echt Verlass :D
JFF_B.G.Michi

Re: Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 22:11
von kimmi
Such sonst auch mal nach Monitor, das ist ein etwas komplexerer Synchronisationsmechanismus für Nebenläufigkeiten.

Gruß Kimmi

Re: Multithreading (Loop synchronisieren)

Verfasst: 04.12.2009, 23:22
von eXile
Nönönö, eine Barrier ist hier angesagt. :)

Re: Multithreading (Loop synchronisieren)

Verfasst: 05.12.2009, 11:43
von kimmi
Stimmt, da hast du recht. Habe den Monitor mit dem Semaphore durcheinander gekriegt.

Gruß Kimmi