Also für diejenigen, die es interessiert.
Das erzeugen eines Threads mit der Funktion
lua_newthread ist etwas, das man nicht mit mehreren Threads machen sollte, da es zum Ansturz führt.
Das manuelle kopieren von lua_State bringt auch nicht so viel.
Grund ist, das in den Internas von Lua die Struktur global_State verwendet wird. lua_State ist eigentlich nur der Stack, der auf global_State verweist.
Probleme entstehen also durch das Verändern des global_State in mehreren Threads.
Da es mir zu mühselig ist, alle lua funktionen durch zu gehen und nachzusehen, wie dieser global_Stack erzeugt und verwendet wird, bin ich einen anderen Weg gegangen.
Ich lade jetzt die Skriptdatei in ein char Array und lasse mir daraus bei Bedarf ein neu VM (lua_State) erzeugen,welche ich dann verwende. Bei vorkompilierten Skripten liefert das eigentlich ein gutes Ergebnis und bei normalen Skripten läuft es für die Entwicklung schnell genug.
Die VM erzeuge ich dann so:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
lua_State *L;
char *buffer;
int bufferLength;
// Skript laden und Buffer füllen
// . . .
// VM anlegen
lua_open(L);
// Skript in die VM laden
luaL_loadbuffer(*L,buffer,bufferLength,"Skriptname");
// Skript ausfüren und Funktionen verfügbar machen
lua_pcall(*L, 0, LUA_MULTRET, 0);
|
Nicht schön, aber funktioniert in einer akzeptablen Geschwindigkeit.