Software Engineering Frage



  • Super!



  • Das wird nicht übersetzt! Pointer? Wann existiert objB?

    ClassA objA = new ClassA(objB); // <=== objB gibt's hier nicht 
    ClassB objB = new ClassB(objA);
    

    Peter_Mueller schrieb:

    Und Threadsynchronisation mache ich indem ich eine while(!flag); loop einbaue

    flag ist std::atmoic<bool>?
    Busy wait?



  • 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.


Anmelden zum Antworten