Клон государства Луа - PullRequest
3 голосов
/ 23 марта 2010

В последнее время я столкнулся со многими трудностями при разработке с использованием C ++ и Lua. Моя ситуация такова: по какой-то причине в моей программе C ++ могут быть тысячи Lua-состояний. Но эти состояния должны быть одинаковыми сразу после инициализации. Конечно, я могу сделать luaL_loadlibs () и lua_loadfile () для каждого состояния, но это довольно тяжело (на самом деле, это занимает довольно много времени для меня, даже просто начальное одно состояние). Итак, меня интересует следующая схема: как это возможно для сохранения отдельного состояния Lua (единственного состояния, которое необходимо инициализировать), которое затем клонируется для других состояний Lua?

Ответы [ 4 ]

4 голосов
/ 24 марта 2010

Когда я начинал с Lua, как и вы, я однажды написал программу с тысячами состояний, у меня были те же проблемы и мысли, пока я не понял, что делаю это совершенно неправильно:)

У Lua есть сопрограммы и потокиВы должны использовать эти функции, чтобы делать то, что вам нужно.Сначала они могут быть немного хитрыми, но вы сможете понять их через несколько дней, это будет стоить вашего времени.

1 голос
/ 07 июня 2017

взгляните на следующий вызов API lua. Я думаю, что это именно то, что вам нужно.

lua_State *lua_newthread (lua_State *L);

Это создает новый поток, помещает его в стек и возвращает указатель на lua_State, который представляет этот новый поток. Новый поток, возвращаемый этой функцией, совместно использует с исходным потоком свою глобальную среду, но имеет независимый стек выполнения.

Нет явной функции, чтобы закрыть или уничтожить поток. Потоки подлежат сборке мусора, как и любой объект Lua.

1 голос
/ 23 марта 2010

К сожалению, нет.

Вы можете попробовать Плутон для сериализации всего состояния. Он работает довольно хорошо, но в большинстве случаев стоит примерно столько же, сколько и обычная инициализация.

0 голосов
/ 06 мая 2010

Я думаю, что будет трудно сделать именно то, что вы запрашиваете здесь, учитывая, что простое копирование состояния будет иметь внутренние ссылки, а также потенциально указатели на внешние данные. Необходимо будет восстановить эти внутренние ссылки, чтобы не просто иметь несколько состояний, указывающих на источник клона.

Вы можете сериализовать состояние после запуска и затем загрузить его в последующие состояния. Если инициализация действительно дорогая, это может стоить.

Я думаю, что для выполнения того, что вы хотите, было бы относительно легко сделать, было бы относительно легко поместить состояния в разные процессы, инициализируя одно состояние и затем разветвляясь, однако ваша операционная система поддерживает это: http://en.wikipedia.org/wiki/Fork_(operating_system)

Если вы хотите что-то доступное из Lua, вы можете попробовать что-то вроде этого: Как построить канал чтения-записи с помощью lua?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...