Software Engineering Frage



  • sowas geht doch auch oder. Kann sein dass die C++ Syntax die 100% passt .

    ClassA objA;
    ClassB objB;
    objA = new ClassA(objB); 
    objB = new ClassB(objA);
    


  • Wie wäre es mit einer dritten Klasse, die die Kommunikation übernimmt?

    Die kannst du instantiieren und den beiden anderen per ctor-Injection mitgeben.



  • Ja mal sehen. Das ist dann eben Software Engineering. Es gibt eben mehrere Möglichkeiten..



  • Peter_Mueller schrieb:

    Das ist dann eben Software Engineering.

    Blabla





  • Oder das Observer Pattern (in seinen Formen) ...



  • Artchi schrieb:

    Schau die mal das Pattern an:
    https://sourcemaking.com/design_patterns/mediator

    Das C++ Beispiel ist ja grausig:
    https://sourcemaking.com/design_patterns/mediator/cpp/1

    * iostream.h
    * unnötiger Weise rohe Strings
    * unnötiges Postinkrement
    * rohe new/delete
    * Zuweisungen im Konstruktor an Stelle einer Konstruktorinitialisierungsliste



  • Was hat der "schreckliche" Beispielcode mit dem Pattern zu tun? Die Beispiele habe ich mir gar nicht angeschaut, weil Patterns erstmal von Code unabhängig sind!
    Und selbst wenn die Beispiele schrecklich sind? Heißt ja nicht das man gehindert wird es besser zu machen.

    Es ging um das Pattern, den Code muss Peter_Mueller natürlich für seine Bedürfnisse schreiben.



  • Es tut mir Leid, falls ich dich persönlich angegriffen haben sollte,
    aber ich bin schon der Meinung, dass Code-Beispiele zumindest grundlegenden Qualitätsansprüchen genügen sollten.

    Artchi schrieb:

    Die Beispiele habe ich mir gar nicht angeschaut, weil Patterns erstmal von Code unabhängig sind!

    Dem stimme ich generell zu. Trotzdem helfen Beispiele dem Verständnis ungemein.
    Dann wiederum ist mir gar kein Beispiel lieber als ein schlechtes.

    Artchi schrieb:

    Und selbst wenn die Beispiele schrecklich sind? Heißt ja nicht das man gehindert wird es besser zu machen.

    Es ging um das Pattern, den Code muss Peter_Mueller natürlich für seine Bedürfnisse schreiben.

    Auch dem stimme ich zu, allerdings habe ich aufgrund des Verlaufs dieses Threads meine Zweifel an den Fähigkeiten von Peter_Mueller.
    Aber ich lasse mich gerne eines besseren belehren 🙂



  • DrakoXP schrieb:

    Auch dem stimme ich zu, allerdings habe ich aufgrund des Verlaufs dieses Threads meine Zweifel an den Fähigkeiten von Peter_Mueller.

    Ach, seine anderen Threads hast du gar nicht gelesen? 😃



  • Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue wobei das flag immer vom anderen thread aktualisiert wird. Wenn ThreadA fertig ist dann setzt er das flag und schon wird die while loop verlassen und ThreadB kann seinen Code ausführen...

    Ich hoffe das ist ein Scherz...



  • nee ich mach das so . Kein Scherz . Sorry



  • hustbaer schrieb:

    Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue wobei das flag immer vom anderen thread aktualisiert wird. Wenn ThreadA fertig ist dann setzt er das flag und schon wird die while loop verlassen und ThreadB kann seinen Code ausführen...

    Ich hoffe das ist ein Scherz...

    Peter_Mueller schrieb:

    nee ich mach das so . Kein Scherz . Sorry

    Ich nehme an, er meint, dass diese Art und Weise unglaublich viel Performance schluckt. Auf der einen Seite machst du ein Busy Waiting, was einen Thread auslasten wird und dabei nutzt du (hoffentlich) einen Atomic, der zu lesen und zu schreiben sehr teuer ist. Jedenfalls unter Contention. Besser wäre da eine Condition Variable.



  • Skym0sh0 schrieb:

    Ich nehme an, er meint, dass diese Art und Weise unglaublich viel Performance schluckt.

    Nicht immer. In diversen low-Level lockfree-Implementationen findet man de facto derartige "Loops", die es einfach nochmal versuchen, wenn z.B. ein compare-and-swap fehlschlägt.
    Diese sind aber meist an Stellen, wo hohe Contention unwahrscheinlich ist, und am Ende nur ein, zwei Instruktionen synchronisiert werden müssen.

    In den allermeisten Fällen sind solche Loops aber tatsächlich eine schlechte Idee (!), und ich würde ebenfalls dringend zu höheren Synchronisationsmechanismen wie mutex , condition_variable ,
    etc. raten - es sei denn man ist definitiv kein Anfänger und weiss ganz genau was man tut ;).



  • Skym0sh0 schrieb:

    Ich nehme an, er meint, dass diese Art und Weise unglaublich viel Performance schluckt. Auf der einen Seite machst du ein Busy Waiting, was einen Thread auslasten wird und dabei nutzt du (hoffentlich) einen Atomic, der zu lesen und zu schreiben sehr teuer ist. Jedenfalls unter Contention. Besser wäre da eine Condition Variable.

    Ja, genau. Busy-Loops sind schlecht. Bis auf wenn sie es nicht sind, und dazu hat Finnegan ja schon was geschrieben.

    Und genau für sowas hat der liebe Gott Condition-Variablen gemacht.



  • ja aber man braucht ja trotzdem eine loop wo man dann die condition Variable abfrägt. Anders gehts doch nicht oder.

    while(!condtionVariable){}; 
                startYourjob();
    


  • Peter_Mueller schrieb:

    ja aber man braucht ja trotzdem eine loop wo man dann die condition Variable abfrägt.

    Jaja



  • Der thread muss ja am laufen gehalten werden. Ohne dauerschleife endet der Thread. Sorry, ich bin nicht der beste Software Engineer.



  • Peter_Mueller schrieb:

    ich bin nicht der beste Software Engineer.

    Wenn du damit ausdrücken willst, dass du Google nicht bedienen kannst: ja, das trifft es.



  • Peter_Mueller schrieb:

    Der thread muss ja am laufen gehalten werden. Ohne dauerschleife endet der Thread. Sorry, ich bin nicht der beste Software Engineer.

    Kann es sein, dass ein Grossteil dieses Threads auf einem Missverständnis beruht?
    Selbstverständlich ist es nicht ungewöhnlich, dass eine Thread-Hauptfunktion eine Dauerschleife beinhaltet, die auf ein Flag testet, mit dem sich erkannt wird,
    ob der Thread beendet werden soll (natürlich mit Code, der den Thread schlafen legt, wenn er gerade nichts zu tun hat, z.B. mithilfe einer condition_variable ,
    sonst lastet die Schleife einen CPU-Kern mit "Nichtstun" voll aus). Als du das erwähnt hast, drehte sich Frage allerdings um die "Threadsynchronisation".
    Das sind Mechanismen, die verhindern sollen, dass zwei Threads gleichzeitig auf eine gemeinsam genutzte Ressource zugreifen, bei der dieser Zugriff nur dann
    gut geht, wenn es nur ein Thread tut (im Allgemeinen Speicher, wenn mindestens einer der Threads in den Speicher schreibt). Zur Synchronisation verwendet
    man für gewöhnlich einen Mutex - man kann das jedoch auch mit einem Loop machen, der auf ein Flag wartet, was jedoch meistens keine gute Idee ist.
    Ich glaube einige der Reaktionen hier rühren daher, dass du den Eindruck erweckt hast, du würdest letzteres tun. Es sollte jedanfalls nicht schaden, wenn
    du dich noch etwas mehr in die Thematik einliest und dich nochmal mit den Begrifflichkeiten auseinandersetzt.

    Finnegan


Anmelden zum Antworten