2010-06-10 6 views
13

Ich habe ein Programm mit 4 Threads.Einbetten mehrerer Lua-Instanzen in einem Programm mit mehreren Threads

Innerhalb jedes Threads mache ich ein luaL_newstate();

Jeder Thread hat nur Zugriff auf seine eigene Lua-Instanz.

Gibt es etwas, über das ich mir Gedanken machen muss? [I.e. Gibt es einen versteckten Zustand, den alle Lua-Instanzen hinter meinem Rücken teilen?]

Vielen Dank!

Antwort

19

Nein, das sollte gut funktionieren. Der gesamte Interpreter-Status ist in jeder Lua-Instanz enthalten. Ich würde sogar sagen, dass dies der bevorzugte Weg ist, Lua mit mehreren Threads und/oder Prozessen zu verwenden.

Wenn Sie feststellen, dass Sie zwischen Lua-Status eventuell kommunizieren müssen, ist es am besten, die Daten zu serialisieren und sie mit der C-API zu übergeben. Ich empfehle das Whitepaper "Exploring Lua for Concurrent Programming" zu lesen. Es führt ein Verfahren aus mehreren Lua processes mit message passing Verwendung für inter-process communication.

5

Das Erstellen einer einzigen lua_State pro Thread ist eine gute Lösung für mehrere Threads von Lua Ausführung. Diese Zustände sind jedoch sehr getrennt. Insbesondere ist es schwierig, sicher zwischen ihnen zu kommunizieren, da die Lua-API nur Thread-sicher ist, solange auf jeden einzelnen Thread gleichzeitig zugegriffen wird. (Na ja, es sei denn, lua_lock und lua_unlock als geeignete Mutex implementiert sind, die sie nicht in der Standard-Builds des lua Kern.)

Wenn das Niveau der Isolation nicht akzeptabel ist, dann müssen Sie eine der mehreren untersuchen Mechanismen, mit denen Lua-Instanzen in einem Thread-Prozess gut mit anderen spielen können.

Meine bevorzugte Wahl ist Lua Lanes, die für mehrere Threads zusammen mit einem Mechanismus zum Übergeben von Nachrichten und Teilen von Werten zwischen ihnen in einer thread-sicheren Weise bietet. Werte der meisten Lua-Typen (einschließlich userdata mit einer kleinen C-Seiten-Unterstützung von der Bibliothek, die sie verwendet) können sicher und effizient von einer Spur zu einer anderen übertragen werden.

Andere Mechanismen existieren, und ein guter Ausgangspunkt für die meisten von ihnen ist am Lua Benutzer wiki page on MultiTaksing.

3

Sie sind gut, solange Sie nicht versuchen, Werte zwischen Lua-Instanzen zu übergeben, ohne sie zuerst in C zu konvertieren. Zum Beispiel wird es nahezu unmöglich sein, eine veränderbare Tabelle zwischen Instanzen zu teilen.

Was Sie fragen, hört sich einfach an, ist aber nicht notwendiger als einfach mehrere Prozesse laufen zu lassen, jeder mit eigenem Lua und eigenem Adressraum.