【问题标题】:lua_newthread is stoppinglua_newthread 正在停止
【发布时间】:2011-12-03 12:12:33
【问题描述】:

我正在使用 LUA 的线程,并且我在我的代码中使用 lua_newthread 必须执行相同的功能 n 次。

为了与比赛的线程一起工作,在 C++ 中实例化一些线程,并为每个线程分配一个 lua_state,this lua_state = lua_newthread。 该线程仅在应用程序结束时被销毁,因此我总是重用这些线程的属性 lua_state。我的问题是这样的 运行一段时间后,应用程序发生崩溃,这可能是由垃圾收集器引起的?

在我上一个应用程序中,我使用了命令 lua_gc (thread, LUA_GCSTOP, 0),但错误仍然存​​在。

我尝试的另一个策略是每次运行 lua_resume 的结束,我添加了命令 lua_settop (thread, 0),这样就耗尽了电池并 没有消耗任何内存空间。

请帮帮我,会发生什么?

【问题讨论】:

    标签: c++ lua garbage


    【解决方案1】:

    Lua 线程像 CPU 线程。 Lua 不是线程安全的;你不能跨实际线程并行执行 Lua 代码。 Lua 允许协作多任务,但不允许真正的 CPU 线程。

    您可以从不同的 CPU 线程调用不同的实际 lua_State 对象,但前提是它们真正分开。如果你从根 lua_State 创建了一个 Lua 线程,那么你不能在该 Lua 线程上调用 Lua 代码,同时也调用根 lua_State 上的 Lua 代码。如果两个 Lua 线程共享同一个父 lua_State,则不能同时在这两个 Lua 线程上执行 Lua 代码。

    所以你需要重组你正在做的事情。不使用线程,而是使用lua_newstate 为每个 CPU 线程创建一个 Lua 状态。每个lua_State 将完全独立于其余部分。

    【讨论】:

    • 谢谢!使用完全独立的策略lua_State,有没有办法只实现全局变量的共享?我需要访问全局变量。在这种情况下,我使用 LOCK 和 UNLOCK 方法来访问这些变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2017-02-09
    相关资源
    最近更新 更多