Was bedeutet threadsicher, auf Klassenebene



  • Hallo,

    ich hab in der MSDN - als ich mich weiter über Threads informiert habe 🙂 - folgenden Satz gelesen:

    "...sind MFC-Objekte auf Objektebene nicht threadsicher, auf Klassenebene hingegen schon..."

    Da bin ich etwas unsicher geworden... Was ist der Unterschied zwischen threadsicher auf Objektebene und Klassenebene... bzw. was ist threadsicher auf Klassenebene?

    Vielleicht kann mir hier jemand eine Erklärung liefern :). Danke dafür schonmal...



  • Das heißt vermutlich dass die statischen Member einer Klasse standardmäßig synchronisiert oder aus anderen Gründen sicher sind, Instanz-Member dagegen nicht. Wenn es anders ist, wird es extra vermerkt. Im .Net Framework ist es jedenfalls genauso, halte ich also für sehr wahrscheinlich, dass man es bei der MFC auch so gemacht hat.



  • "Die Klasse A ist threadsafe" bedeutet dass du z.B. in Thread 1 und Thread 2 gleichzeitig Instanzen der Klasse A bzw. auch statische Memberfunktionen verwenden darfst. OHNE diese Eigenschaft wäre es z.B. nichtmal OK lokale Instanzen von A in mehreren Threads gleichzeitig zu verwenden. Das wäre ziemlich übel, da man dann die Klasse A für Programme mit mehreren Threads ziemlich vergessen könnte.

    "Die Instanzen von Klasse A sind threadsafe" bedeutet dass du in Thread 1 und Thread 2 die selbe Instanz der Klasse A verwenden darfst. Gleichzeitig. OHNE diese Eigenschaft darfst du also eine bestimmte Instanz der Klasse A NICHT in verschiedenen Threads gleichzeitig verwenden. Damit lässt sich meist sehr einfach und gut leben. Davon abgesehen wäre es meist unsinnig Instanzen threadsafe zu machen, da dies im Normalfall eine ziemliche Bremse wäre -- jede Methode (die von aussen aufgerufen werden kann) müsste wohl irgendwo irgendwas synchronisieren, und Synchronisieren kostet viel Zeit.



  • Kann mir mal einer ein Beispiel für eine Klasse geben die NICHT threadsicher auf Klassenebene ist... ich kann mir da gerade nicht viel vorstellen außer ne statische Methode die auf eine globale Variabel zugreift und diese verändert.

    Grüße



  • Naja, überall wo von einer Klasse X ein oder mehr Singletons verwendet werden, die nicht selbst threadsafe auf Instanzebene sind, und wo diese Zugriffe auch nicht innerhalb der Klasse X synchronisiert werden.

    Ob diese Singletons nun Globale Objekte sind, statische Membervariablen oder sonstige Varianten von Singletons ist dabei egal.

    Weiters gibts noch viele Abstufungen -- z.B. gibt es öfters den Fall dass Objekte die von der gleichen Factory erzeugt wurden nicht in verschiedenen Threads gleichzeitig verwendet werden dürfen. So einen Fall kann man schnell haben, nämlich z.B. wenn die Factory gewisse Daten speichert die alle Objekte gemeinsam verwenden, Statistiken mitführt oder was auch immer.



  • Jochen_82 schrieb:

    Kann mir mal einer ein Beispiel für eine Klasse geben die NICHT threadsicher auf Klassenebene ist... ich kann mir da gerade nicht viel vorstellen außer ne statische Methode die auf eine globale Variabel zugreift und diese verändert.

    Grüße

    Jo that's it eigentlich. Was hustbaer aufzählt sind mögliche Spezialfälle davon. Man macht per Design statische Sachen thread safe weil es meistens trivial ist. Und wo es nicht per default so ist macht man es mit Synchronisation, einfach nur damit es überall konsistent thread safe ist.



  • Danke 🙂


Anmelden zum Antworten