3 Stimmen

Klonen eines Lua-Zustands

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?

4voto

Robert Gould Punkte 66858

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.

2voto

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.

1voto

Javier Punkte 58737

Leider nein.

Sie könnten versuchen, mit Pluto den gesamten Status zu serialisieren. Das funktioniert recht gut, kostet aber in den meisten Fällen etwa die gleiche Zeit wie die normale Initialisierung.

0voto

James Snyder Punkte 3902

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X