2010-06-10 11 views
13

Ho un programma con 4 thread.incorporare più istanze lua in un programma con più thread

All'interno di ogni thread, faccio un luaL_newstate();

Ogni thread ha accesso solo alla propria istanza di lua.

C'è qualcosa di cui mi devo preoccupare? [Vale a dire c'è qualche stato nascosto che tutte le istanze di lua condividono dietro la mia schiena?]

Grazie!

risposta

19

No, dovrebbe funzionare bene. Tutto lo stato dell'interprete è autonomo in ogni istanza Lua. Direi anche che è il modo migliore di usare Lua con più thread e/o processi.

Se si scopre che è necessario comunicare tra gli stati Lua alla fine, è meglio serializzare i dati e passarli utilizzando l'API C. Raccomando di leggere il whitepaper "Exploring Lua for Concurrent Programming". Esso introduce un metodo di utilizzo multiplo Lua processes con message passing per inter-process communication.

5

Creazione di un singolo lua_State per thread è una buona soluzione per avere più thread di esecuzione Lua. Tuttavia, tali stati sono molto separati. In particolare, è difficile comunicare in modo sicuro tra loro poiché l'API Lua è protetta da thread solo finché si accede a ogni lua_State da un singolo thread alla volta. (Beh, a meno lua_lock e lua_unlock sono implementate come un mutex adatto, che non sono in default costruisce del nucleo lua.)

Se questo livello di isolamento non è accettabile, allora avete bisogno di indagare su uno dei numerosi meccanismi per consentire alle istanze di Lua di giocare bene con gli altri in un processo threaded.

La mia scelta preferita è Lua Lanes che prevede più thread con un meccanismo per passare messaggi e condividere valori tra loro in modo thread-safe. I valori della maggior parte dei tipi Lua (compreso userdata con un piccolo supporto C laterale della libreria che lo utilizza) possono essere trasferiti in modo sicuro ed efficiente da una corsia all'altra.

Esistono altri meccanismi e un buon punto di partenza per la maggior parte di questi è a wiki page on MultiTaksing dell'utente Lua.

3

Siete a posto finchè non state provando a passare valori tra istanze Lua senza convertirli prima in C, fino a quando non avete . Ad esempio, sarà quasi impossibile condividere una tabella mutabile tra le istanze.

Quello che chiedi sembra facile da fare ma non necessariamente più utile del semplice fatto di avere più processi in esecuzione, ciascuno con la propria Lua e il proprio spazio di indirizzamento.