Встраивание нескольких экземпляров lua в многопоточную программу
У меня есть программа с 4 потоками.
Внутри каждого потока я делаю luaL_newstate();
Каждый поток имеет доступ только к своему собственному экземпляру lua.
Есть ли что-то, о чем мне нужно беспокоиться? [Т.е. есть ли какое-то скрытое состояние, что все экземпляры lua участвуют за моей спиной?]
Спасибо!
Ответы
Ответ 1
Нет, это должно работать нормально. Все условия интерпретатора содержатся в каждом экземпляре Lua. Я бы даже сказал, что это предпочтительный способ использования Lua с несколькими потоками и/или процессами.
Если вы обнаружите, что вам в конечном итоге необходимо установить связь между состояниями Lua, лучше всего сериализовать данные и передать их с помощью API C. Я рекомендую прочитать " Изучение Lua для параллельного программирования". В нем представлен метод использования нескольких процессов Lua с сообщением для межпроцессного общения.
Ответ 2
Создание единственного lua_State
для потока - хорошее решение для того, чтобы иметь несколько потоков выполнения Lua. Однако эти государства очень разделены. В частности, трудно безопасно обмениваться данными между ними, поскольку Lua API является только потокобезопасным, пока каждый lua_State
доступен из одного потока за раз. (Ну, если lua_lock
и lua_unlock
не реализованы как подходящий мьютекс, который они не входят в стандартные сборки ядра lua.)
Если этот уровень изоляции неприемлем, вам необходимо изучить один из нескольких механизмов, позволяющих экземплярам Lua хорошо работать с другими в поточном процессе.
Мой любимый выбор Lua Lanes, который предусматривает множество потоков вместе с механизмом передачи сообщений и совместного использования значений между ними в потокобезопасном путь. Значения большинства типов Lua (включая userdata
с небольшой поддержкой со стороны из библиотеки, которая его использует) можно безопасно и эффективно передавать с одной полосы на другую.
Существуют и другие механизмы, и хорошей отправной точкой для большинства из них является страница пользователя Lua
Ответ 3
Вы добры, пока вы не пытаетесь передать значения между экземплярами Lua, не переведя их сначала в C. Например, почти невозможно разделить изменчивую таблицу среди экземпляров.
То, что вы просите, звучит легко, но не обязательно более полезно, чем просто выполнение нескольких процессов, каждый со своим собственным Lua и собственным адресным пространством.