以线程安全的方式将userdata放在lua堆栈上

时间:2015-07-15 09:00:13

标签: c lua

我有一个C函数,它调用一个lua函数,然后启动一系列在C和lua之间跳转的异步回调。我希望所涉及的所有C函数能够访问我在原始C函数中创建的某些特定用户数据。但棘手的部分是:所有这些都应该是线程安全的,而且我也无法更改API,因此在整个回调中传递参考值不是一种选择。

那么有没有办法以某种方式将userdata放在lua_State中,只有" my"回调链可以访问它吗?

1 个答案:

答案 0 :(得分:0)

由于Lua对同一lua_State实例中的数据争用没有线程安全保证,因此我假设您的C代码确保在任何一个代码中只有一段代码与同一lua_State进行通信时间。

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

Lua代码无法访问Lua注册表,除非某些C代码允许他们访问它(BTW:不这样做)。因此,只要您保持此表的完整性,就不必担心Lua脚本会触及并破坏它。