Récemment, j'ai rencontré beaucoup de difficultés lorsque je développais en utilisant C++ et Lua. Ma situation est la suivante: pour une raison quelconque, il peut y avoir des milliers d'états Lua dans mon programme C++. Mais ces états devraient être identiques juste après l'initialisation. Bien sûr, je peux faire luaL_loadlibs() et lua_loadfile() pour chaque état, mais c'est assez lourd (en fait, il me faut un peu de temps pour initialiser un état). Donc, je me demande le schéma suivant: Qu'en est-il de garder un état Lua séparé (le seul état qui doit être initialisé) qui est ensuite cloné pour d'autres états Lua, est-ce possible?Cloner un état Lua
Répondre
Malheureusement, non.
Vous pouvez essayer Pluto pour sérialiser l'état entier. Cela fonctionne plutôt bien, mais dans la plupart des cas, cela coûte à peu près le même temps que l'initialisation normale.
Mais Pluton est juste un outil tiers, vous pouvez simplement l'utiliser dans le script lua. Ce que je veux, c'est cloner lua-state dans l'environnement C++. – hbxfnzwpf
Pourquoi est-ce un problème si les fonctions sont accessibles du côté Lua? Vraisemblablement, vous pourriez regarder les fonctions C qui sont en cours d'enregistrement et appelez simplement ce qu'ils appellent pour sérialiser l'état. Si vous ne voulez pas que ces fonctions soient accessibles depuis Lua, ne les enregistrez pas pour l'utilisateur. Dans l'ensemble, cependant, cela ne semble pas être la meilleure solution. –
Quand j'ai commencé avec Lua, comme vous j'ai déjà écrit un programme avec des milliers d'Etats, a eu le même problème et les pensées, jusqu'à ce que je compris que je faisais tout à fait tort :)
Lua a coroutines et fils, vous devez utiliser ces fonctionnalités pour faire ce dont vous avez besoin. Ils peuvent être un peu difficiles au début mais vous devriez être capable de les comprendre dans quelques jours, ça vaudra bien votre temps.
Coroutine est effectivement une bonne fonctionnalité de Lua, mais ce que je cherche est une façon de cloner lua état dans mon programme C++. Comme il y a des milliers de scripts Lua (chacun peut être écrit par une personne différente) pour que je puisse l'exécuter mon programme C++, c'est sympa de les charger en multi-threads. Comme chaque état créé doit charger la même librairie, et charger un autre script commun avant de charger le script correspondant, il suffit de faire lua_loadlib() et lua_load() pour chaque état de lua renvoyé par lua_open(). Suis errant clone lua état directement. – hbxfnzwpf
Je pense qu'il sera difficile de faire exactement ce que vous demandez ici étant donné que la simple copie de l'état aurait des références internes ainsi que potentiellement des pointeurs vers des données externes. Il faudrait reconstruire ces références internes pour ne pas avoir seulement plusieurs états pointant vers la source du clone.
Vous pouvez sérialiser l'état après le démarrage, puis le charger dans les états suivants. Si l'initialisation est vraiment coûteuse, cela peut en valoir la peine.
Je pense que la chose la plus proche de faire ce que vous voulez que ce serait serait relativement facile est de mettre les états dans les différents processus en initialisant un état, puis bifurquer, mais votre système d'exploitation supporte: http://en.wikipedia.org/wiki/Fork_(operating_system)
Si vous voulez quelque chose de disponible au sein de Lua, vous pouvez essayer quelque chose comme ceci: How do you construct a read-write pipe with lua?
jetez un coup d'oeil à l'appel API lua suivant Je pense que c'est exactement ce dont vous avez besoin.
lua_State *lua_newthread (lua_State *L);
Cela crée un nouveau thread, il pousse sur la pile, et renvoie un pointeur vers un lua_State
qui représente ce nouveau fil. Le nouveau thread renvoyé par cette fonction partage avec le thread d'origine son environnement global, mais dispose d'une pile d'exécution indépendante.
Il n'y a pas de fonction explicite pour fermer ou détruire un thread. Les threads sont soumis à la collecte des ordures, comme tout objet Lua.
Ce fil demande à peu près la même question: http://stackoverflow.com/questions/1383768/cloning-lua-state –
Copie possible de [Cloning Lua state] (http://stackoverflow.com/questions/1383768/ cloning-lua-state) – greatwolf