2016-07-15 8 views
1

Ich möchte ein Lua-Skript in meinem C++ - Programm laden und dann dieses Skript mehrmals in separaten Threads aufrufen. Ich versuche zu vermeiden, das Skript in jedem Thread zu laden (warum durch diesen Overhead gehen).Lua-Skript einmal laden, in mehreren Zuständen in mehreren Threads ausführen

Ich bin so etwas wie dies in dem C++ Programm zu denken:

create lua state L 
load script into L 

und in n Fäden tun:

create local lua state Si (i = 1..n, i.e., separate state per thread) 
grab "compiled" script from L and invoke in the context in Si 

Gibt es einen "Standard" Ansatz, dies zu tun? Das Hauptziel besteht darin, zu vermeiden, dass jeder Thread das Skript lädt. Das Skript kann auch mehrfach im Zustand Si ausgeführt werden. Beachten Sie, dass die Scripts, die in separaten Threads ausgeführt werden, nicht zusammenarbeiten (d. H. Sie wissen nichts voneinander und wir möchten es so beibehalten).

+1

Sprechen Sie über C++ - Threads oder Lua-Threads? Lua hat auch ein Konzept von Threads, die eigentlich keine anderen Programm-Threads bedeuten. Denken Sie auch nicht, dass Sie tun können, was Sie wollen, ohne Datenrennen oder Mutexen, die im Grunde jeden einzelnen Staat erzwingen. Sie müssen das Skript für jeden Status ausführen, und jeder Status muss ein separater Status sein. – Rochet2

+0

Ich spreche über separate C++ - Threads. Das Hauptprogramm lädt das Skript im Zustand L. Später werden C++ - Threads erstellt, die in L erstelltes Skript anwenden wollen, aber da es sich um neue C++ - Threads handelt und mehrere Threads dasselbe Skript zur gleichen Zeit ausführen können, denke ich, dass Sie das tun möchte, dass das Skript in einem für den Thread spezifischen Zustand ausgeführt wird. Mein Pidgin Code ist C++ Code. – mkilian

Antwort

1

Wie ich in einem Kommentar gesagt habe, glaube ich nicht, dass Sie tun können, was Sie wollen mit C++ - Threads ohne Datenrennen oder Mutexe, die alle parallele Ausführung blockieren. Ein einzelner Lua-Status scheint nicht für die Verwendung durch mehrere Threads ausgelegt zu sein, und Lua-Threads unterstützen auch kein Multithreading und es gibt keine Möglichkeit, Daten magisch von einem komplett separaten Zustand in einen anderen zu verschieben.

jedoch, was Sie können versuchen, zu „übersetzen“ der lua-Skripte auf einem Zustand von loadstring tun und dann dump und so auf sichere Weise speichern, dass Sie es von allen Threads zugreifen können das Skript schneller aus dem Bytecode laden direkt mit loadstring.

Andernfalls müssten Sie alle Zustände getrennt halten und alle Kommunikation zwischen ihnen durch C++ durchführen und Thread-Sicherheit dort sicherstellen.

+0

Ich denke, die Antwort scheint zu sein, dass Lua-Objekte nicht zwischen Zuständen geteilt werden können. Es ist bedauerlich, dass Lua kein Konzept von "verschachtelten" Zuständen hat, d. H. Ich parse ein Skript im globalen Zustand, ich erstelle einen verschachtelten Zustand, der auf den globalen Zustand zugreifen kann (aber Änderungen im lokalen Zustand beibehalten). – mkilian

+1

@mkilian Lua hat verschachtelte Zustände, aber Sie können sie nicht gleichzeitig aus mehreren C++ - Threads verwenden. Wirklich das Problem ist, dass Sie nichts auf eine thread-sichere Weise tun können. Jeder Zugang zu Lua muss aufgrund seines Designs garantiert single-threaded sein. – Rochet2