Как я могу получить глобалы или окружение из основного состояния в Lua Lane?

local lanes = require "lanes".configure()
local linda = lanes.linda()
local thread = lanes.gen({globals = _G}, function()
print("Starting thread...")
while true do
    local command = linda:receive("cmd")
    if command=="quit" then
        break
    else
        broadcast(-1,"Hello from lanes.")
    end
end
end)

local threads = {}
local NCORES = 2
for i=1,NCORES do threads[i] = thread() end
linda:send("cmd", "test")
for i=1,NCORES do linda:send("cmd", "quit") end
for i=1,NCORES do threads[i]:join() end

В качестве теста на моем игровом сервере для правильной работы Lua Lanes я пытаюсь использовать глобальную функцию из основного состояния в новом потоке. К сожалению, этот конкретный код продолжает приводить к Assert Failure in tools.c line 1216, Я пытаюсь настроить это так, чтобы я мог выполнять занятую работу, не блокируя основной поток и, в конечном счете, мой игровой сервер. Возможно, есть лучший способ сделать это? Или, может быть, я мог бы запустить свои скрипты через luaL_newthread(state) на моем сервере? Пожалуйста, посоветуйте мне правильное направление, так как это в настоящее время останавливает мое развитие. Заранее спасибо.

1 ответ

Решение

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

Что вы можете сделать, это require модуль в самой теме. Чтобы получить broadcast Функция в потоке, у вас есть эти варианты:

  1. Положил broadcast и другие функции в модуль и вызов require в теме.
  2. хранить broadcast как local перед функцией потока, чтобы получить его в качестве повышения.

Обновление: к сожалению, второй способ не работает, как раньше. Из-за проблем совместимости с LuaJIT 2, Lanes должен вычислять таблицу отображения собственных функций в то время configure это запустить. Я не нашел способ передать простую функцию C в поток иначе, чем на самом деле require модуль в потоке.

Другие вопросы по тегам