Требуется ли от другого lua_State использование общей библиотеки?

Мое серверное приложение, выполняющее сценарии Lua одновременно с использованием LuaJit. Каждый внутренний класс сценария C++ хранит собственное представление lua_State.

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

Я знаю, что есть довольно много библиотек, таких как luv (привязки libuv из проекта luvit), turbo, cqueue, и на данный момент мне просто интересно, буду ли я использовать, например, EventLoop, предоставленный libuv из сценария A, это будет тот же цикл, что и в скрипте B, для которого требуется та же библиотека?

Проблема заключается в том, что сценарий Lua может иметь длительную задачу, в то время как код C++ должен вызывать обратный вызов события. Учитывая, что lua_State не является потокобезопасным, он заблокирует весь поток сервера.


person teoring    schedule 21.08.2018    source источник


Ответы (1)


Все зависит от вызываемой библиотеки.

Вы (более или менее) не можете загружать один и тот же SO более одного раза, поскольку по определению это один и тот же код. Таким образом, если вызываемая библиотека сама по себе не является потокобезопасной (у нее есть какое-то глобальное состояние библиотеки или что-то еще), то любой код, который зависит от нее, не будет потокобезопасным без какой-либо формы явной синхронизации.

Вам нужно будет исследовать библиотеки, используемые этим кодом, чтобы увидеть, полагаются ли они на глобальное состояние или нет.

person Nicol Bolas    schedule 21.08.2018
comment
Спасибо, это имеет смысл для меня. Ответ решает мой вопрос. - person teoring; 22.08.2018