Multithreading (Loop synchronisieren)

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Multithreading (Loop synchronisieren)

Beitrag 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
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

Re: Multithreading (Loop synchronisieren)

Beitrag von dowhilefor »

Eine Semaphore vielleicht? :)

Und noch ein Link
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Multithreading (Loop synchronisieren)

Beitrag 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.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: Multithreading (Loop synchronisieren)

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Multithreading (Loop synchronisieren)

Beitrag von kimmi »

Such sonst auch mal nach Monitor, das ist ein etwas komplexerer Synchronisationsmechanismus für Nebenläufigkeiten.

Gruß Kimmi
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Multithreading (Loop synchronisieren)

Beitrag von eXile »

Nönönö, eine Barrier ist hier angesagt. :)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Multithreading (Loop synchronisieren)

Beitrag von kimmi »

Stimmt, da hast du recht. Habe den Monitor mit dem Semaphore durcheinander gekriegt.

Gruß Kimmi
Antworten