Thread und private, public, protected
-
Hi,
also ich bin gerade dabei mir eine Applikation zu schreiben, die mehrere Threads starten soll. Der Thread ist in einer Klasse gekapselt. (wxThread von wxWindows). Ich habe mir jetzt eine Klasse erstellt, die von wxThread "abgelitten"
ist. Ich habe in mehreren Tutorials gelesen, daß egal wie viele Threads ich erzeuge, diese (anders als Prozesse) dann den selben Speicherbereich nutzen. Wo kann ich den nun Variablen deklarieren, die für jeden Thread einmalig sind? Ist jede Variable im Bereich private einmalig?
Meine zweite Frage ist, was genau der Bereich protected in dieser Thread-Klasse für einen Unterschied ausmacht? Oder besser: Was genau gehört in den Bereich protected einer Klasse?
Würde mich wirklich über eine paar links zu irgendwelchen Tutorials oder Guides freuen.
Danke schon mal.
-
Hallo,
mir scheint du wirfst da ein paar Dinge durcheinander. Die Bedeutung der access-specifier ist unabhängig von Threads. Letztere kennt Standard-C++ überhaupt nicht. Membervariablen gehören immer zu einem Objekt. Das ist unabhängig von Threads und auch unabhängig vom access-level.Was genau gehört in den Bereich protected einer Klasse?
Die Schnittstelle für abgeleitete Klassen.
-
Solange du Variablen ganz normal innerhalb einer Funktion erzeugst, gibt es keine Probleme, zB 'int x;'. Auch new geht. Problematisch kann es werden, wenn du Variablen nutzt, die in einem anderen Thread erzeugt wurden speziell globalen Variablen. Mit Muxtexen läßt sich dies jedoch in den Griff kriegen. Wenn jeder Thread seine eigenen 'globalen Variablen' haben soll, dann leite einfach public von wxThread ab und schreib diese Variablen in den public-Bereich:
class MyThread : public wxThread { public: int var1; .... }; // Zugriff auf die Variable: wxThread* wxthread = wxThread::This(); // aktuellen Thread ermitteln // thread ist 0 (NULL), wenn es das Hauptprogramm oder ein 'fremder' Thread ist, also notfalls vorher testen MyThread* mythread = static_cast<MyThread*>(wxthread); // und zu MyThread casten cout << mythread->var1; // Thread-globale Variable ausgeben
Ich kenne mich mit wxWidget (wie es neuerdings heißt) nicht aus, aber wesentlich anders scheint es auch nicht zu sein. Wie oben angedeuted, braucht man dies nicht, um normale Variablen in Funktionen zu erzeugen - dort funktioniert es so wie immer.
Zur Syncronisation steht etwas im Linux-FAQ, jedoch nicht speziell wxThread.
-
Fux: Wäre ein dynamic_cast nicht sicherer als ein static_cast?
public-Variablen sind IMHO auch nicht das Gelbe vom Ei.
-
Hmm, diese Reaktion hatte ich fast befürchtet.
Meiner Meinung nach gehören Variablen nur in den privaten Bereich und haben nichts in protected oder public zu suchen, also muss ich schon eine gute Begründung haben, warum ich es doch tue. In diesem Beispiel sind es 'simulierte' globale Variablen und die Prinzipien der Kapselung greifen hier kaum bis garnicht (in C++ gibt es kein private auf globaler Ebene).
Bei static_cast <-> dynamic_cast ist meine Begründung recht spitzfindig, also versuch ich erst garnicht es zu erklären. In der Tat hab ich etwas länger überlegt, was man hier nehmen sollte ...
Unterm Strich muss man sagen, das mit etwas C++-Erfahrung man solche Arten von Variablen vermeiden kann und sich die oberen Probleme deshalb erübrigen. Wahr ist aber auch, das globale Variablen - insbesondere für Anfänger - das Leben erleichtern.
cu
-
Fux schrieb:
Hmm, diese Reaktion hatte ich fast befürchtet.
Meiner Meinung nach gehören Variablen nur in den privaten Bereich und haben nichts in protected oder public zu suchen,
Naja, wenn du davon erben willst, müssen sie ja wenigstens in den allermeisten Fällen protected sein.
Aber public braucht es meistens wirklich nicht, außer sie sind const, dann spricht ja auch nicht unbedingt was dagegen. Hängt halt sehr vom Einzelfall ab.
-
Okay, als erstes schon mal danke für eure Hilfe.
Also unter public habe ich keine einzige Variable deklariert. Mache ich auch nie. Ich habe C++ (oder irgendeine Programmiersprache) nie wirklich "gelernt" -> z.B. Studium, Ausbildung, o.ä., sondern ich habe es mir einfach anhand von Beispielprogrammen und tutorials beigebracht. Deshalb weiß ich nicht, ob das jetzt Standard-C++ ist oder nicht, aber ich deklariere unter public nie Variablen, sondern höchstens Funktionen, mit denen sich der Wert der Variablen ändern bzw. Abfragen läßt. Ob das jetzt richtig ist oder nicht, wißt ihr wahrscheinlich besser. Würde mich aber mal interessieren, ob man das so macht!?!
Zu meiner eigentlichen Frage:
Ihr habt es ja praktisch schon gesagt, aber nur noch mal zur Sicherheit. Wenn ich eine Klasse (Thread) habe und in dieser Klasse unter private eine Variable deklariere, ist der Wert dieser Variablen, dann in jedem Thread der selbe oder sind das wie in den Funktionen deklarierte Variablen unterschiedliche?
Sorry, daß ich noch einmal so doof nachfrage, ich möchte nur sicher gehen...
-
Optimizer schrieb:
Naja, wenn du davon erben willst, müssen sie ja wenigstens in den allermeisten Fällen protected sein.
Nur wenn du wirklich aus der Derived Klasse auf die Variablen von Base zugreifen musst - was sehr selten vorkommt.
Und selbst dann reichen oft Accessors.
-
Wenn ich eine Klasse (Thread) habe und in dieser Klasse unter private eine Variable deklariere, ist der Wert dieser Variablen, dann in jedem Thread der selbe oder sind das wie in den Funktionen deklarierte Variablen unterschiedliche?
Jedes Objekt der Klasse (in deinem Fall Thread) hat einen eigenen Satz Membervariablen. Hast du also zwei Objekte a und b, dann ist a.variable eine andere Variable als b.variable unabhängig davon in was für Threads a und b ausgeführt werden.
Der Wert von b.variable ist unabhängig von Zuweisungen an a.variable und andersherum.Zum Thema protected:
Es gibt genauso viele (oder wenige) Gründe eine Membervariable protected zu machen wie es Gründe dafür gibt eine Membervariable public zu machen. Sprich:
Dort wo eine public-Membervariable unangebracht ist, dort ist auch eine protected-Membervariable unangebracht.