是否需要使用共享库的不同 lua_State?
Does requires from different lua_State using shared llibrary?
我的服务器应用程序 运行 Lua 脚本同时使用 LuaJit。每个内部 C++ 脚本 class 存储自己对 lua_State 的表示。
我想要实现的是实现某种共享线程池,以避免每个 运行 脚本产生大量线程(我知道 Lua 运行协程和那些不是真正的线程,但一些库确实产生了实际的线程,比如 cqueue 执行 C fork )
我知道有很多库,例如 luv(来自 luvit 项目的 libuv 绑定)、turbo、cqueue,此时我只是想知道我是否会使用,例如,脚本 A 中的 libuv 提供的 EventLoop是否会与需要相同库的脚本 B 中使用的循环相同?
问题在于 Lua 脚本可能有一个很长的 运行 任务,而 C++ 代码需要调用事件回调。考虑到 lua_State 不是线程安全的,它将阻塞整个服务器线程。
这完全取决于被调用的库。
您(或多或少)不能多次加载相同的 SO,因为根据定义这是相同的代码。因此,如果被调用的库本身不是线程安全的(它有一些库全局状态或其他),那么如果没有某种形式的显式同步,任何依赖它的代码都不是线程安全的。
您必须调查此代码使用的库,以查看它们是否依赖于全局状态。
我的服务器应用程序 运行 Lua 脚本同时使用 LuaJit。每个内部 C++ 脚本 class 存储自己对 lua_State 的表示。
我想要实现的是实现某种共享线程池,以避免每个 运行 脚本产生大量线程(我知道 Lua 运行协程和那些不是真正的线程,但一些库确实产生了实际的线程,比如 cqueue 执行 C fork )
我知道有很多库,例如 luv(来自 luvit 项目的 libuv 绑定)、turbo、cqueue,此时我只是想知道我是否会使用,例如,脚本 A 中的 libuv 提供的 EventLoop是否会与需要相同库的脚本 B 中使用的循环相同?
问题在于 Lua 脚本可能有一个很长的 运行 任务,而 C++ 代码需要调用事件回调。考虑到 lua_State 不是线程安全的,它将阻塞整个服务器线程。
这完全取决于被调用的库。
您(或多或少)不能多次加载相同的 SO,因为根据定义这是相同的代码。因此,如果被调用的库本身不是线程安全的(它有一些库全局状态或其他),那么如果没有某种形式的显式同步,任何依赖它的代码都不是线程安全的。
您必须调查此代码使用的库,以查看它们是否依赖于全局状态。