Funktion schritt für schritt ausführen, während programmlauf und ohne Debug



  • l'abra d'or schrieb:

    Und eine wichtige Sache vergisst du komplett: Multiprozessorsysteme. Viel Spaß, wenn du selber versuchst, die einzelnen Funktionshappen auf mehrere Kerne zu verteilen, damit du wirklich parallele Abarbeitung erhältst 😛

    Warum um Gottes Willen sollte er das tun? damit er ganze Cache-Inhalte zwischen den Kernen hin- und herschaufeln lässt?

    Für das was er vorhat empfehle ich dem OP ein wenig ordentliche Lektüre über Compilerbau und Parallel-Abläufe. Das sollte ihn ein paar Monate beschäftigen...



  • Wahrscheinlich krieg ich jetzt (wieder) den Kopf abgeschlagen aber:
    Google -> Windows Threads
    Liefert dir als ersten Treffer die Windows Doku zum Thema. Und da gibts richtig viel zum Thema zu lesen, mit viel Beispielcode und viel Kommentaren darin.

    Willst du dich nicht nur auf Windows festlegen, kann ein Blick in Richtung boost.threads oder C++0x nicht schaden (der neue Standard soll ja Klassen für Threads enthalten).



  • pumuckl schrieb:

    l'abra d'or schrieb:

    Und eine wichtige Sache vergisst du komplett: Multiprozessorsysteme. Viel Spaß, wenn du selber versuchst, die einzelnen Funktionshappen auf mehrere Kerne zu verteilen, damit du wirklich parallele Abarbeitung erhältst 😛

    Warum um Gottes Willen sollte er das tun? damit er ganze Cache-Inhalte zwischen den Kernen hin- und herschaufeln lässt?

    Weil es durchaus Betriebssysteme geben soll, die einzelne Threads auf verschiedene Kerne verteilen können. Ich wollte eigentlich nur darauf hinaus, dass es ziemlich aufwändig ist, die Effizienz von nativen Threads selber nachzubauen.



  • mal kurz eine Frage: Was sind eigentlich Handles, und wozu dienen diese ?



  • Du solltest dich bei deinem Kenntnisstand erstmal durch die Grundlagen arbeiten.



  • l'abra d'or schrieb:

    pumuckl schrieb:

    l'abra d'or schrieb:

    Und eine wichtige Sache vergisst du komplett: Multiprozessorsysteme. Viel Spaß, wenn du selber versuchst, die einzelnen Funktionshappen auf mehrere Kerne zu verteilen, damit du wirklich parallele Abarbeitung erhältst 😛

    Warum um Gottes Willen sollte er das tun? damit er ganze Cache-Inhalte zwischen den Kernen hin- und herschaufeln lässt?

    Weil es durchaus Betriebssysteme geben soll, die einzelne Threads auf verschiedene Kerne verteilen können. Ich wollte eigentlich nur darauf hinaus, dass es ziemlich aufwändig ist, die Effizienz von nativen Threads selber nachzubauen.

    Einzelne Threads, die jeweils ihren eigenen Stack haben, ja. Aber nicht einzelne Funktionshappen, wo dann ständig zumindest der Stackframe der Funktion und einiges mehr an referenzierten Daten zwischen den verschiedenen Kernen und ihren Caches hin- und her- hoppeln müsste.



  • pumuckl schrieb:

    l'abra d'or schrieb:

    pumuckl schrieb:

    l'abra d'or schrieb:

    Und eine wichtige Sache vergisst du komplett: Multiprozessorsysteme. Viel Spaß, wenn du selber versuchst, die einzelnen Funktionshappen auf mehrere Kerne zu verteilen, damit du wirklich parallele Abarbeitung erhältst 😛

    Warum um Gottes Willen sollte er das tun? damit er ganze Cache-Inhalte zwischen den Kernen hin- und herschaufeln lässt?

    Weil es durchaus Betriebssysteme geben soll, die einzelne Threads auf verschiedene Kerne verteilen können. Ich wollte eigentlich nur darauf hinaus, dass es ziemlich aufwändig ist, die Effizienz von nativen Threads selber nachzubauen.

    Einzelne Threads, die jeweils ihren eigenen Stack haben, ja. Aber nicht einzelne Funktionshappen, wo dann ständig zumindest der Stackframe der Funktion und einiges mehr an referenzierten Daten zwischen den verschiedenen Kernen und ihren Caches hin- und her- hoppeln müsste.

    Das passiert bei fast jedem OS eigentlich "dauernd".
    Aber natürlich nicht parallel, klar dass immer nur ein "Core" an einem logischen Thread nuckeln kann.



  • lk schrieb:

    mal kurz eine Frage: Was sind eigentlich Handles, und wozu dienen diese ?

    Weiß keiner so genau



  • lk schrieb:

    mal kurz eine Frage: Was sind eigentlich Handles, und wozu dienen diese ?

    Üblicherweise sind das so etwas ähnliches, wie Zeiger. Also eine Referenz auf ein Objekt.



  • Handles sind sind Referenzen fuer Objekte, die das Betriebssystem bereitstellt, und du mittels Betriebssystemfunktionen manipulieren (arbeiten) kannst.



  • knivil schrieb:

    Handles sind sind Referenzen fuer Objekte, die das Betriebssystem bereitstellt, und du mittels Betriebssystemfunktionen manipulieren (arbeiten) kannst.

    Das sind Betriebssystem-Handles. Weil sie das Betriebssystem bereitstellt. Es kann aber auch andere Systeme geben (irgendeine Bibliothek), die mit Handles arbeiten.
    Beispiel:
    Eine Client-Server Architektur, bei der Server ein bestimmtes Objekt erzeugt und der Client damit arbeiten darf. Bei einer nicht geteilten Architektur würde der Server dem Client einfach einen Pointer oder eine Referenz liefern und der Client arbeitet selber lustig mit den Methoden des Objektes. Läuft das ganze aber auf zwei verschiedenen Rechnern, geht das nicht. Dann muss der Client beispielsweise sagen "Hey Server, ändere mal ab Objekt XY die Namensvariable", statt einen Pointer auf XY muss er dem Server z.B. eine ID des Objektes geben (die er vorher vom Server bekommen hat). Diese IDs werden auch Handle genannt.



  • Interessanter Aspekt, ich persoenlich wuerde einfach ObjektId sagen, aber Handle wuerde ich auch passend finden. Damit ist ein Handle dann leider irgendwie alles und nichts.



  • knivil schrieb:

    Interessanter Aspekt, ich persoenlich wuerde einfach ObjektId sagen, aber Handle wuerde ich auch passend finden. Damit ist ein Handle dann leider irgendwie alles und nichts.

    Hmm. Ein Handle ist einfach ein Verweis (wie auch immer der geschieht) auf ein Objekt. Ob das jetzt ein Name, ID, Zeiger oder was auch immer ist spielt ja keine Rolle. Wichtig ist ja nur, dass das referenzierte Objekt eindeutig der ID zugewiesen werden kann.

    Auf kann man den Begriff ja auch abstrakter benutzen, wie z.B ist eine Email Adresse eine Art Handle für ein Postfach. Mein Name ist ein Handle auf mich usw.



  • knivil schrieb:

    Interessanter Aspekt, ich persoenlich wuerde einfach ObjektId sagen, aber Handle wuerde ich auch passend finden. Damit ist ein Handle dann leider irgendwie alles und nichts.

    Wobei es sich eben nichtmal zwangsläufig um ein Objekt im programmiersprachlichen Sinne handeln muss. Handles können sich auch auf Datenbanken, deren Tabellen oder Einträge darin beziehen, auf Netzwerkverbindungen, Hardwareteile oder irgendwelche abstrakten Dinge. Und genau das ist der Knackpunkt, ein Handle ist ein abstrakter, wesenloser Stellvertreter für ein "irgendwas". Handle bedeutet ja übersetzt nichts weiter als "Griff" und ist nicht mehr als das: ein kleines, gut handhabbares Mittel, um ein anderes, wie auch immer geartetes, meist größeres "Ding" festhalten oder von A nach B reichen zu können ohne dich damit auseinandersetzen zu müssen, welche Form, Farbe, Geschmack, Gewicht oder sonstwas dieses "Ding" hat (oder ob es überhaupt eine dieser Eigenschaften hat).

    Mich würds nicht wundern (ich fänds bei genauerem Nachdenken sogar angebracht), wenn es in der einen oder anderen Programmiersprache einen eigenen Typ für handles gibt (an Stelle eines long oder pointers oder Strings oder was auch immer).



  • Ich mache für diese Aufgabenstellung immer eine Protokolldatei, die den Ablauf des Programmes ohne debug protokolliert. Stammt aus den Anfängen der Programmierung und ist aus meiner Sicht auch heute noch sehr zu empfehlen. Debuggen ist aufwendig, die Reaktivierung einer Protokolldatei dagegen nicht. Probemloses kann man auskommentieren. In einer Release-Version fügt man einfach ein DeleteFile() ein, was man in der Testversion jederzeit wieder inaktiv machen kann.



  • berniebutt schrieb:

    Ich mache für diese Aufgabenstellung immer eine Protokolldatei, die den Ablauf des Programmes ohne debug protokolliert. Stammt aus den Anfängen der Programmierung und ist aus meiner Sicht auch heute noch sehr zu empfehlen. Debuggen ist aufwendig, die Reaktivierung einer Protokolldatei dagegen nicht. Probemloses kann man auskommentieren. In einer Release-Version fügt man einfach ein DeleteFile() ein, was man in der Testversion jederzeit wieder inaktiv machen kann.

    In der Releaseversion loggst Du genauso allen Scheiß mit und löscht dann mit DeleteFile das log?
    👍 cool 👍


Anmelden zum Antworten