2010-03-23 5 views
2

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

+2

Этот вопрос задает примерно тот же вопрос: http://stackoverflow.com/questions/1383768/cloning-lua-state –

+0

Возможный дубликат [Состояние клонирования Lua] (http://stackoverflow.com/questions/1383768/ cloning-lua-state) – greatwolf

ответ

1

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

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

+0

Но Pluto - это просто сторонний инструмент, вы можете просто использовать его в сценарии lua. Что я хочу - клонировать lua-state в среде C++. – hbxfnzwpf

+0

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

3

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

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

+0

Coroutine действительно хорошая особенность Lua, но то, что я ищу, - это способ клонирования состояния lua в моей программе на C++. Поскольку существуют тысячи сценариев lua (каждый может быть написан другим человеком) для меня, чтобы выполнить в моя программа на C++, приятно загружать их в несколько потоков. Поскольку каждое созданное состояние lua должно загружать один и тот же lib и загружать другой общий скрипт, прежде чем загружать его соответствующий скрипт, просто выполните lua_loadlib() и lua_load() для каждого состояния lua, которое возвращается lua_open(), для меня огромное бремя, поэтому я я блуждаю клон lua state напрямую. – hbxfnzwpf

0

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

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

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

Если вы хотите что-то доступное из Lua, вы можете попробовать что-то вроде этого: How do you construct a read-write pipe with lua?

0

Обратите внимание на следующий вызов API Lua Я думаю, что это именно то, что вам нужно.

lua_State *lua_newthread (lua_State *L); 

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

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