встраивание нескольких экземпляров lua в многопоточную программу - PullRequest
14 голосов
/ 11 июня 2010

У меня есть программа с 4 потоками.

В каждом потоке я выполняю luaL_newstate ();

Каждый поток имеет доступ только к своему собственному экземпляру lua.

Есть ли что-то, что мне нужно беспокоиться?[Т.е. есть ли скрытое состояние, которое все экземпляры lua разделяют за моей спиной?]

Спасибо!

Ответы [ 3 ]

20 голосов
/ 11 июня 2010

Нет, это должно работать просто отлично.Все состояния интерпретатора содержатся в каждом экземпляре Lua.Я бы даже сказал, что это предпочтительный способ использования Lua с несколькими потоками и / или процессами.

Если вы обнаружите, что в конечном итоге вам необходимо обмениваться данными между состояниями Lua, то лучше сериализовать данные и передатьэто с помощью C API.Я рекомендую прочитать документ « Изучение Lua для параллельного программирования ».Он вводит метод использования нескольких процессов Lua с передачей сообщений для межпроцессное взаимодействие .

6 голосов
/ 11 июня 2010

Создание одного lua_State на поток - хорошее решение для нескольких потоков исполнения Lua. Однако эти состояния очень разделены. В частности, между ними трудно безопасно обмениваться данными, поскольку Lua API является поточно-ориентированным, поскольку каждый lua_State доступен из одного потока за раз. (Ну, разве что lua_lock и lua_unlock реализованы как подходящий мьютекс, которого нет в сборках по умолчанию ядра lua.)

Если этот уровень изоляции неприемлем, вам нужно исследовать один из нескольких механизмов, позволяющих экземплярам Lua хорошо играть с другими в многопоточном процессе.

Мой любимый выбор - Lua Lanes , который предусматривает несколько потоков, а также механизм для передачи сообщений и совместного использования значений между ними потокобезопасным способом. Значения большинства типов Lua (включая userdata с небольшой поддержкой на стороне C из библиотеки, которая его использует) могут безопасно и эффективно передаваться из одной полосы в другую.

Существуют и другие механизмы, и хорошей отправной точкой для большинства из них является вики-страница пользователя Lua на MultiTaksing .

3 голосов
/ 11 июня 2010

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

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

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