以线程安全的方式将userdata放在Lua堆栈中。

我有一个C函数,调用了一个lua函数,然后启动一长串在C和lua之间跳跃的异步回调。我希望所有涉及的C函数都能够访问我在原始C函数中创建的特定userdata。但棘手的是:所有这些都应该是线程安全的,而且我不能更改API,因此在回调中传递引用值不是一个选项。

那么,有没有办法在lua_State中以某种方式放置userdata,以使只有“我的”回调链才能访问它?

点赞
用户734069
用户734069

因为 Lua 在同一 lua_State 实例内对于数据竞争并没有线程安全的保证,我会默认你的 C 代码会确保在任何时候只有一个代码片段与同一 lua_State 进行通信。

通常处理这个问题的方法是通过 Lua 注册表。它是 lua_State 的一部分,可以从任何 C 代码中访问的特殊表。你可以在注册表中指定一些键作为你的特殊值。

Lua 代码无法访问 Lua 注册表,除非有些 C 代码给它们访问权限 (顺便说一句:不要这样做)。只要你维护这个表的完整性,你就不必担心 Lua 脚本会对它进行破坏。

2015-12-08 18:58:21