调用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后如何获取线程索引?的主要内容,如果未能解决你的问题,请参考以下文章