Probleme beim Synchorniesieren von Threads
-
Hallo ich habe gerade folgende Situation.
Ich besitze eine beliebiege Anzahl von Threads, welche "paralel" ihre Berechnungen machen und die berechneten Werte in eine gemeinsame Datenbasis Schreiben.
Diese Threads müssen miteinander synchroniesiert werden, da sie untereinander auf die Werte der anderen Threads aus dem letzten Rechendurchgang zurückgreifen.
Daher müssen alle Treads einen Rechendurchgang beendet haben, ihre Daten an die Datenbasis übermittelt haben befor der nächste Rechendurchgang starten darf.Im Moment versuche ich dies mittels EVENTS und einer Statusverwaltenen Klasse zu realiesieren. Betohnung liegt leider auf Versuche....

Denn leider funktioniert das einfach nicht so wie es soll.
Und ich sehe den Wald vor lauter Bäumen nicht mehr......
Im Prinziep suche ich eine Möglichkeit die beliebig vielen Threads
auf ein oder mehrere Events schlafen zu legen und alle gleichzeitig mit einem Signal(en) wieder zu wecken.
Bisher verweisen dafür alle Threads mittels Zeiger auf die eine Statusverwaltene Klasse. Diese zählt die gesammt Anzahl der Threads, sowie jene die sich als Aktiv bei ihr melden und jene die warten auf synch.Weiter hat die VerwalterKlasse zwei Instanz auf die Klasse EVENT und schickt Threads über diese Instanz schlafen wenn bei einer Prüfung der internen Zähler noch nicht alle Threads mit einem Rechnendurchgang fertig sind. Zu welchem Event die Threads geschickt werden ist abhängig vom Aktuellen Rechendurchlauf. Hintergrund es kamm vor das ein Thread länger zum reaktivieren brauchte und das anstehende Signal von einem anderen Thread der eigendlich warten sollte ,weil er den folgenden Rechendurchgang schon beendet hatte, genutzt wurde, daher 2 verschiedene Events
Der letzte Thread der fertig wird sollte dann alle anderen wieder wecken ohne sich selber schlafen zu legen. *tolle Therorie
*
Nur leider bekomme ich es nicht hin alle Threads zu wecken.
D.H. es kommt vor das ein Thread sein Signal einfach Tja überhört... und weiter schläft. Was einen Deadlock zur Folge hat. Dies geschieht sporadisch mal im 10 mal im 100 mal im 1000 Rechendurchlauf...Wenn Jemand einen Ansatz hat wie man das Problem lösen kann Bitte her damit,
wenn ihr noch mehr infos braucht bitte fragen.
Bin für jeden Tipp dankbar, denn solangsam bekomme ich HASS auf diesen Teil meines Programms

Und schon mal danke an jeden der sich das bis hier her durchgelesen hat

Hier die Event Klasse HEADER
#if !defined EVENTS_H #define EVENTS_H #include <windows.h> class TEvent { public: TEvent(int = TRUE); ~TEvent(void); void EventSignal(void); void EventWait(void); void EventReset(void); int EventTest(void); private: HANDLE Event; }; #endifDie Event Klasse CPP
#include "Events.h" TEvent::TEvent(int automatic) { Event = CreateEvent(NULL,!automatic,FALSE,NULL); } TEvent::~TEvent(void) { CloseHandle(Event); } void TEvent::EventSignal(void) { SetEvent(Event); } void TEvent::EventReset(void) { ResetEvent(Event); } void TEvent::EventWait(void) { WaitForSingleObject(Event,INFINITE); } int TEvent::EventTest(void) { return (WaitForSingleObject(Event,0) != WAIT_TIMEOUT); }
-
Der Standard(C/C++) kennt keine Threads. Aufgrund deiner Code-Beispiele nehme
ich mal an das du unter Windows programmierst. Daher versuchs mal im WINAPI-Forum.
Verwendest du ein bestimmtes Framework (T.. => BCC ?) versuch am besten gleich
dort, also MFC- oder Borland-Forum.
-
Ja danke werd ich da Probieren.
Die Methoden für Event kommen ja auch aus der
<Windows.h > :-)hätt ich mir ja selber überlegen können
...Wenn ein Admin das Liest öhm Thread bitte schließen oder Löschen
Werd einen neuen im anderen Bereich anlegen
Danke
-
Das ist nicht nötig, der Thread kann auch einfach verschoben werden. Verrate noch welchen Compiler du benutzt: MSVC oder BCB?
-
hmm habe schon neu angelegt.
Merke ich mir aber für das nächste mal
(hoffe nicht nötig)
Ich nutze als Entwicklungsumgebung Microsft Visual C++ 6.0 AutorenVersion
von daher denke ich mal MSVC
-
Hier geht's weiter:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-118478.html