Lua очень хорошо избегает выделения кучи и глобальных указателей на выделенную память.lua_newstate
принимает функцию распределителя в качестве параметра. Предоставленная функция будет использоваться для выделения / освобождения всей памяти, связанной с объектом lua_State
.Включая указатель, возвращаемый lua_newstate
.
Таким образом, гипотетически, вы можете предоставить функцию распределителя, которая выделяет / освобождает разделяемую память между процессами.И затем, вы можете просто передать lua_State
другому процессу и получить к нему доступ.
Во-первых, вы явно не можете сделать это «изнутри lua»;такого рода вещи низкого уровня просто не происходит.Вы не можете получить доступ к lua_State
объекту из Lua.Вы должны контролировать процесс создания lua_State
, чтобы это было возможно.Итак, мы говорим здесь о C (эквивалентном) коде, а не о коде на Lua.
Теперь вы можете представить функцию C для Lua, которая возвращает легкие пользовательские данные, которые точно являются точными lua_State*
обсуждаемый.Но Lua на самом деле ничего не может сделать с легкими пользовательскими данными, кроме передачи их другим API-функциям C.
Во-вторых, в то время как система Lua дает гарантию, что она будет распределять память только через распределитель, система делает не дают гарантию, что то, что вы пытаетесь сделать, будет работать.Вполне возможно, что реализация Lua действительно использует глобальную память процесса, если она делает это таким образом, чтобы разные потоки могли обращаться к этой глобальной памяти без нарушения гарантий многопоточности.
Очевидно, что вы можете проверить Luaреализация, чтобы увидеть, если он делает что-нибудь в этом роде.Но я хочу сказать, что гарантии состоят в том, что каждый независимый lua_State
будет изолирован от потоков и каждый lua_State
будет выделять память только через данный распределитель.Нет гарантии, что в реализации Lua нет некоторого глобального хранилища, которое она использует для каких-то целей.
Так что простого совместного использования памяти, выделенной состоянием Lua, может быть недостаточно.
Кроме того,даже если это работает, два процесса не могут получить доступ к одному и тому же объекту lua_State
одновременно, точно так же, как два потока в одном процессе не могут получить доступ к lua_State
одновременно.