Ab wann muss seine Thread schützen ?
-
Hi, hab mal ne kleine Frage:
Ab wann (also genauer: Bei welchen Aktionen) muss ich meinen Code mittels CriticalSections absichern ?
Schon bei normalen Zugriffen auf Variablen ?PS: Sind die STL-Klassen Thread-Safe ?
Danke schonmAl

-
Sry 4 DoppelPost...nochwas kleines:
Wie oft sollte man Enter/Leave -CriticalSection aufrufen ?Mal dazu (Pseudo-)Beispiel:
void Class::func(void) { _Gefaerlich = 6; for(int i = 0; i < _max; i++) { _thread_dead[i] = true; } // Was unwichtiges... // Aktualisierung von Kontrollvariablen delete [] pImportant; }Wo und wie oft sollte man dort jetzt Enter/LeaveCs. aufrufen ? (In der For-Schleife oder außerhalb ?usw...)
Danke!!!!

-
Critical-Level schrieb:
Hi, hab mal ne kleine Frage:
Ab wann (also genauer: Bei welchen Aktionen) muss ich meinen Code mittels CriticalSections absichern ?
Immer dann wenn zwei Threads nicht atomare Aktionen auf gemeinsamen Daten ausführen.
Da selbst ein "i++" nicht atomar ist, ist Synchronisation praktisch immer erforderlich.Critical-Level schrieb:
PS: Sind die STL-Klassen Thread-Safe ?
Nein.
-
Dank dir!
Und zu meinem Beispiel Code ?
Da selbst ein "i++" nicht atomar ist, ist Synchronisation praktisch immer erforderlich.
Hm also kann ich bei jeder Funktion/Methode einfach
void Class::func(void) { EnterCS(); // ... LeaveCS(); }machen ?
-
anonymus schrieb:
Da selbst ein "i++" nicht atomar ist, ist Synchronisation praktisch immer erforderlich.
Hierfür würde ich aber InterlockedIncrement verwenden...
Und wenn man Synchronisation einfach so macht, dann hat man irgendwas bei Multi-Threading nicht ganz verstanden...
Ganz einfach gesagt: AFIK gibt es keine Thread-Sichere Klassen (weder in MFC/ATL/STL). Somit muss man alles sichern was nötig ist.
-
Dank dir Jochen!
Wie sieht hier aus (will mal ein Beispiel, woran ich mich in etwa halten kann
)Critical-Level schrieb:
Wo und wie oft sollte man dort jetzt Enter/LeaveCs. aufrufen ? (In der For-Schleife oder außerhalb ?usw...)
Danke!!!!

-
Du solltest es immer dann machen wenn Du es brauchst. Das hängt ganz vom Anwendungsfall ab...
-
Critical-Level schrieb:
Dank dir Jochen!
Wie sieht hier aus (will mal ein Beispiel, woran ich mich in etwa halten kann
)Critical-Level schrieb:
Wo und wie oft sollte man dort jetzt Enter/LeaveCs. aufrufen ? (In der For-Schleife oder außerhalb ?usw...)
Danke!!!!

Um einen Block von kritischen Aktionen.
In dem Fall also z.B. ein EnterCS am Anfang der Funktion und eine LeaveCS nach der for-Schleife.
-
Verwende keine Threads solange du dir nicht sicher bist
. Das Thema ausgiebig zu erklären würde den Rahmen hier sprengen. Vielleicht weiss ja irgendjmd. einen guten Link oder gute Bücher zu dem Thema und mag das hier posten. Ich leider nicht 