在不同的 lua_State 中使用共享库需要做什么准备?

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

我想要实现某种共享线程池,以避免从每个运行的脚本生成大量的线程(我知道Lua运行协程,但有些库确实生成实际线程,例如cqueue执行C fork)。

我知道有一些库,如luv(luvit项目的libuv绑定),turbo,cqueue,此时我想知道,例如,在脚本A中提供的EventLoop是否会在需要相同库的脚本B中使用相同的循环?

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

点赞
用户734069
用户734069

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

基本上你不可能加载两个相同的共享库,因为根据定义,它们是相同的代码。因此,如果被调用的库本身不是线程安全的(它具有某些库全局状态或其他),那么任何依赖于它的代码都需要某种形式的显式同步才能实现线程安全。

你需要调查此代码使用的库,看看它们是否依赖于全局状态。

2018-08-21 13:21:22