"Global bekannte Variablen"?



  • Hallo,
    ich habe mich heute mal etwas mit der Google v8 JavaScript Engine beschäftigt. Dabei habe ich in der Dokumentation gesehen, dass das ganze ja durchaus gut durchdacht ist.

    Aber eins macht mich stutzig: Wie man hier - http://code.google.com/intl/de/apis/v8/get_started.html#hello - sieht, wird eine Instanz der Klasse HandleScope erstellt. Sinn ist, dass alle Objekte aus dem aktuellen Scope in die "Stack-Liste" des erstellten HandleScope s gesteckt werden.

    Beispiel:

    Handle<String> source = String::New("'Hello' + ', World!'");
    

    Der String wird automatisch in den Stack vom erstellten HandleScope gepackt.

    Zwei Fragen:

    1. Woher weiß der String, dass er in genau diesen Stack muss? Er kennt die Instanz von HandleScope doch gar nicht. Ich würde das ganze nur kapieren, wenn es so aussähe:
    Handle<String> source = String::New(handle_scope /*pass as reference*/, "'Hello' + ', World!'");
    
    1. Bin ich recht in der Annahme, dass Handle<T> den operator= so (oder ähnlich) deklariert?
    template<typename T> void Handle::operator=(T &other)
    

    Gruß und Danke!



  • Ich vermute dass da globale, thread-lokale Variablen verwendet werden.

    D.h. der Konstruktor von "HandleScope" trägt die Adresse "seines" Objekts in einer globalen Variable ein, und merkt sich das was vorher dringestanden hat. Der Destruktor schreibt dann wieder den Wert rein der vorher dringestanden hat.

    Und die "Handles" lesen diese globale Variable aus, um den "aktuellen HandleScope" zu finden, damit sie sich dort registrieren können.



  • Mhh, doch so simpel?
    Aber ich kann mir nicht so recht vorstellen, dass so etwas primitives genutzt wird. Ich kann nicht glauben, dass Google v8 nicht Threadsafe entwickelt hat. So wie ich das nämlich verstanden habe, wäre die Idee von dir nicht Threadsafe, oder?

    Gruß



  • Sofern die entsprechenden Mechanismen implementiert sind, sollte man auch das Threadsafe realisieren können. Aber wer weiß...



  • Klar ist das thread-safe, ich hab ja geschrieben globale, thread-lokale Variablen.
    D.h. jeder Thread bekommt seine eigene Kopie von diesen Variablen.

    Das ist mit Standard C++ 03 nicht umsetzbar, aber die grösseren Implementierungen bzw. auch Betriebssysteme stellen entsprechende Mechanismen zur Verfügung. Bzw. man kann einfach z.B. Boost.Thread verwenden, wo diese entsprechende Mechanismen intern verwendet werden um eine schönes einheitliches Interface anzubieten.



  • Danke für die Erklärung!

    Hat dieser Mechanismus einen bestimmten Namen, den ich gezielt Googlen kann? Ich würde mir so etwas mal gerne anschauen.

    Gruß



  • Die Scope-Geschichte oder die thread-lokalen Variablen?
    Zweiteres nennt man "thread local storage".
    Ersteres... keine Ahnung.
    Kenne ich hauptsächlich im Zusammenhang mit Logging-Libs und Error-Handling. Da werden über ähnliche Mechanismen Dinge auf einen thread-lokalen "Stack" gepusht damit man bei Log-Ausgaben oder beim Werfen von Exceptions darauf zugreifen kann. Poor-man's Callstack und so.



  • Danke!


Anmelden zum Antworten