使用共享库是否需要来自不同的lua_State?

时间:2018-08-21 07:28:01

标签: c++ lua luajit

我的服务器应用程序同时使用LuaJit运行Lua脚本。每个内部C ++脚本类都存储自己的lua_State表示形式。

我要实现的目标是实现某种共享线程池,以避免在每个运行的脚本中产生大量线程(我知道Lua在运行协程,而这些不是真正的线程,但是某些库确实产生了实际的线程)线程,例如队列在执行C fork)

我知道有很多库,例如luv(来自luvit项目的libuv绑定),turbo,cqueue,在这一点上,我只是想知道是否要使用例如脚本A的libuv提供的EventLoop?脚本B中使用的循环是否需要相同的库?

问题在于Lua脚本可能具有长时间运行的任务,而C ++代码需要调用事件回调。考虑到lua_State不是线程安全的,它将阻塞整个服务器线程。

1 个答案:

答案 0 :(得分:0)

这完全取决于要调用的库。

您(或多或少)不能多次加载相同的SO,因为根据定义,这是相同的代码。因此,如果被调用的库本身不是线程安全的(它具有某种库全局状态或其他状态),那么依赖它的任何代码如果没有某种形式的显式同步都将不是线程安全的。

您将必须调查此代码使用的库,以查看它们是否依赖于全局状态。