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