发布网友 发布时间:2023-11-12 18:45
共1个回答
热心网友 时间:2024-12-02 06:57
第一:让出协程(线程)。当 C 函数调用了 l ua_yieldk, 当前运行的协程会挂起, 启动这个线程的 lu a_resume 调用返回。 参数 nresults 指栈上需返回给 lu a_resume 的返回值的个数。
1.1当协程再次被延续时,L ua 调用延续函数 k 继续运行被挂起()的 C 函数。 延续函数会从前一个函数中接收到相同的栈, 栈中的 n 个返回值被移除而压入了从 lu a_resume 传入的参数。 此外,延续函数还会收到传给 lu a_yieldk 的参数 ctx。
1.2通常,这个函数不会返回;当协程一次次延续,将从延续函数继续运行。 然而,有一个例外: 当这个函数从一个逐行运行的钩子函数(参见 ) 中调用时,lu a_yieldk 不可以提供延续函数。 (也就是类似 l ua_yield 的形式), 而此时,钩子函数在调用完让出后将立刻返回。 Lu a 会使协程让出,一旦协程再次被延续, 触发钩子的函数会继续正常运行。
当一个线程处于未提供延续函数的 C 调用中,调用它会抛出一个错误。 从并非用延续方式(例如:主线程)启动的线程中调用它也会这样
1.3交换同一个状态机下不同线程中的值。
这个函数会从 from 的栈上弹出 n 个值, 然后把它们压入 to 的栈上。
这个函数等价于调用 lua_yieldk, 不同的是不提供延续函数(参见 )。 因此,当线程被延续,线程会继续运行调用 lu a_yield 函数的函数。
1.4如果给定索引处的值是一个完全用户数据, 函数返回其内存块的地址。 如果值是一个轻量用户数据, 那么就返回它表示的指针。 否则,返回 NULL 。
1.5把给定索引处的 L ua 值转换为一个 C 字符串。 如果 len 不为 NULL , 它还把字符串长度设到 *len 中。 这个 Lua 值必须是一个字符串或是一个数字; 否则返回返回 NULL 。 如果值是一个数字, l ua_tolstring 还会 把堆栈中的那个值的实际类型转换为一个字符串。 (当遍历一张表的时候, 若把 l ua_tolstring 作用在键上, 这个转换有可能导致 l ua_next 弄错。)
lu a_tolstring 返回一个已对齐指针 指向 L ua 状态机中的字符串。 这个字符串总能保证 ( C 要求的)最后一个字符为零 ('\0') , 而且它允许在字符串内包含多个这样的零。
1.6因为 L ua 中可能发生垃圾收集,所以不保证 lua_tolstring 返回的指针, 在对应的值从堆栈中移除后依然有效。