In letzter Zeit bin ich auf viele Schwierigkeiten gestoßen, als ich mit C++ und Lua entwickelt habe. Meine Situation ist: Aus irgendeinem Grund kann es Tausende von Lua-Zuständen in meinem C++-Programm geben. Aber diese Zustände sollten gerade nach der Initialisierung gleich sein. Natürlich kann ich luaL_loadlibs() und lua_loadfile() für jeden Zustand, aber das ist ziemlich schwer (in der Tat, es dauert eine ziemlich lange Zeit für mich sogar nur initial einen Zustand). Also frage ich mich, das folgende Schema: Wie wäre es mit einem separaten Lua-Status (der einzige Status, der initialisiert werden muss), der dann für andere Lua-Status geklont wird, ist das möglich?
Antworten
Zu viele Anzeigen?Als ich mit Lua anfing, habe ich wie du einmal ein Programm mit tausenden von Zuständen geschrieben und hatte das gleiche Problem und die gleichen Gedanken, bis ich merkte, dass ich es völlig falsch gemacht habe :)
Lua hat Coroutines und Threads. Sie müssen diese Funktionen nutzen, um das zu tun, was Sie brauchen. Sie können anfangs etwas kompliziert sein, aber Sie sollten in der Lage sein, sie in ein paar Tagen zu verstehen, es wird Ihre Zeit wert sein.
Werfen Sie einen Blick auf die folgende Lua-API-Aufruf Ich denke, es ist, was Sie genau brauchen.
lua_State *lua_newthread (lua_State *L);
Dies erzeugt einen neuen Thread, schiebt ihn auf den Stack und gibt einen Zeiger auf einen lua_State
der dieses neue Thema darstellt. Der neue Thread, der von dieser Funktion zurückgegeben wird, teilt mit dem ursprünglichen Thread dessen globale Umgebung, hat aber einen unabhängigen Ausführungsstapel.
Es gibt keine explizite Funktion zum Schließen oder Zerstören eines Threads. Threads unterliegen der Garbage Collection, wie jedes Lua-Objekt.
Ich denke, es wird schwer sein, genau das zu tun, was Sie hier beantragen, da nur das Kopieren des Zustands interne Verweise sowie möglicherweise Zeiger auf externe Daten haben würde. Man müsste diese internen Referenzen rekonstruieren, um nicht einfach mehrere Zustände zu haben, die auf die Klon-Quelle zeigen.
Sie könnten den Zustand nach dem Start eines Programms serialisieren und dann in die nachfolgenden Zustände laden. Wenn die Initialisierung wirklich teuer ist, könnte sich das lohnen.
Ich denke, das, was dem, was Sie wollen, am nächsten kommt und relativ einfach wäre, wäre, die Zustände in verschiedene Prozesse zu stecken, indem man einen Zustand initialisiert und dann forkt, wie auch immer Ihr Betriebssystem das unterstützt: http://en.wikipedia.org/wiki/Fork_(operating_system)
Wenn Sie etwas wollen, das von Lua aus verfügbar ist, könnten Sie so etwas versuchen: Wie konstruiert man eine Lese-Schreib-Pipe mit Lua?