调用newthread后如何获取线程索引?

Posted

技术标签:

【中文标题】调用newthread后如何获取线程索引?【英文标题】:How do I get the thread index after calling newthread? 【发布时间】:2021-08-23 01:03:34 【问题描述】:

在 JNLUA 中,newThread() 是 Java 中的 void 函数,但我不太了解实现该函数的 java 端的 C 代码。另外,有人能解释一下为什么原作者会返回索引/指针吗?

【问题讨论】:

Thread#newThread(Runnable) 返回 Thread,而不是 void。请澄清您的问题。 【参考方案1】:

newThread 将新线程推入 Lua 堆栈。无需返回值。通过指针值连接将很难确保安全(我猜无论如何风格都很差),并且索引很容易获得而不返回它(例如通过getTop或简单地通过跟踪堆栈大小或使用负索引) .对于将值压入堆栈的 API 的所有部分,这或多或少是相同的。

请注意,JNLUA 的 newThread 与 Lua 的 lua_newthread 略有不同; JNLUA 中的线程不太通用,更倾向于像 Lua 协程(当然也是 Lua 线程)一样使用——newThread 从堆栈顶部获取值并将其用作“启动函数” " 用于协程(将在第一次为线程调用resume 时调用)。

我不会推测作者决定以这种方式暴露线程;返回LuaState(和/或公开lua_tothread)也可能是实现更接近原始Lua API的一种合理方式。

这是实现的核心:

static int newthread_protected (lua_State *L) 
    lua_State *T;
    
    T = lua_newthread(L);
    lua_insert(L, 1);
    lua_xmove(L, T, 1);
    return 1;

这是在受保护的调用中完成的,因为lua_newthread 可以抛出异常(如果内存不足)。唯一的参数(因此最初在堆栈上的唯一内容)是索引 1 处的启动函数。lua_newthread 将新线程对象推送到索引 2 处的堆栈。然后lua_insert 将反转新线程的顺序object 和 start 函数,lua_xmove 将 start 函数传递给新线程,然后返回新线程(将其留在调用者堆栈的顶部)。

在 Lua 中,堆栈中已经有 start 函数的新线程可以被 lua_resume 等同于已产生的线程,所以这基本上就是 JNLUA 所做的——它的 resume 可以用来启动具有先前提供的函数的线程。

【讨论】:

以上是关于调用newthread后如何获取线程索引?的主要内容,如果未能解决你的问题,请参考以下文章

PYTHON - 如何在调用文件后获取信息? [复制]

如何以编程方式获取 Xcode 显示的线程名称

Socket 如何知道断开连接的客户端ip地址

如何在不调用索引函数或任何内置函数的情况下获取列表中的索引?

多线程Thread(获取线程名字)

获取当前线程的对象学习二