C 和 Lua - 将 native 对象实例传递给 native Lua 函数

标签 c object static lua

传递给 Lua 以便 Lua 可以调用 native 函数的 C 函数是静态函数,因此与对象实例无关。

在我的应用程序中,我有多个 session 。每个 session 都在自己的线程上运行,有自己的数据和脚本, session N 的脚本必须能够访问 session N 的数据。

问题是,当您注册一个可从 Lua 调用的 native C 函数时,我无法传递 session 对象的实例以使其在静态 Lua 函数中可用。

一种可能是将 session 实例存储到一个静态变量中,该变量可以从静态 C 函数(从 Lua 调用)中调用,但这看起来很脏并且需要同步,这可能会导致某些脚本挂起。

第二种可能是创建一个表示 session 的 Lua 对象并调用它的成员方法,这样,在我的 C 函数中,我就有办法访问表示 session 的 Lua 对象(“t​​his”)和检索此对象表示的实际 native session 实例。但我不知道该怎么做。

有没有办法在 Lua 中创建表示 native 对象实例的 Lua 对象,以便 native Lua 函数可以访问该 native 对象实例?

最佳答案

当你用 Lua 注册一个 C 函数时,你可以存储额外的值作为所谓的“upvalues”。然后,C 函数可以在调用时检索这些值:

// ...
// push session instance pointer
lua_pushlightuserdata( L, (void*)get_current_session() );
// create a closure with one upvalue
lua_pushcclosure( L, my_static_C_function, 1 );
// ... (the resulting Lua function is at the stack top now)

在您的静态 C 函数中,您可以像这样访问实例数据:

static int my_static_C_function( lua_State* L ) {
  session_t* instance = (session_t*)lua_touserdata( L, lua_upvalueindex( 1 ) );
  instance->do_something();
  return 0;
}

关于C 和 Lua - 将 native 对象实例传递给 native Lua 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290360/

相关文章:

javascript - JavaScript 中的所有函数本质上都是方法吗?

Jquery 为什么我无法显示对象?

object - 使用 glBufferData 后可以删除 float 组吗?

c++ - 使用 boost 线程和非静态类函数

c - 将用户输入重定向到/dev/null

c - 为什么我无法访问包含的功能?

c - 将动态分配的指针传递给 pthread 的正确方法是什么

c++ - 具有静态 char* 数组成员的模板特化,多个单元的实例化

c++ - 如何合并一个 pImpl 接口(interface),同时还允许 WndProc 与其交互?

代码浏览 : How to find out which function a function pointer is pointing to?