Встраивание нескольких экземпляров 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 и собственным адресным пространством.