-
从0到1抖音运营变现手册大全:详解线程执行与中断
资源介绍
电甸 第六章 协程及函数的执行
给 界 附加一些用户自定义信息在追求性能的环境很有意义。可以在为 界畵畡 编写的 畃 模块中,直接偏移
界 指针来获取一些附加信息。这比去读取 界 中的注册表要高效的多。另一方面,在多线程环境下,访问注册
表本身会改变 界 的状态,是线程不安全的。
6.2 线程的执行与中断
界畵畡 的程序运行是以线程为单位的。每个 界畵畡 线程可以独立运行直到自行中断,把中断的信息留在状态
机中。每条线程的执行互不干扰,可以独立延续之前中断的执行过程。界畵畡 的线程和系统线程无关,所以不
会为每条 界畵畡 线程创建独立的系统堆栈,而是利用自己维护的线程栈,内存开销也就远小于系统线程。但
界畵畡 又是一门嵌入式语言,和 畃 语言混合编程是一种常态。一旦 界畵畡 调用的 畃 库中企图中断线程,延续它
就是一个巨大的难题10。界畵畡 电甮甲 通过一些巧妙的设计绕过了这个问题。
6.2.1 异常处理
如果 界畵畡 被实现为一个纯粹的运行在字节码虚拟机上的语言11,只要不出虚拟机,可以很容易的实现自
己的线程和异常处理。事实上,界畵畡 函数调用层次上只要没有 畃 函数,是不会在 畃 层面的调用栈上深入下
去的12 。但当 界畵畡 函数调用了 畃 函数,而这个 畃 函数中又进一步的回调了 界畵畡 函数,这个问题就复杂的
多。考虑一下 畬畵畡 中的 異畡畩畲畳 函数,就是一个典型的 畃 扩展函数,却又回调了 界畵畡 函数。
界畵畡 底层把异常和线程中断用同一种机制来处理,也就是使用了 畃 语言标准的 畬畯畮畧番畭異 机制来解决这个
问题。
为了兼顾 畃甫甫 开发,在 畃甫甫 环境下,可以把它配置为使用 畃甫甫 的 畴畲畹 甯 畣畡畴畣畨 机制。13
这些是通过宏定义来切换的。
源代码 甶甮由甲町 畬畤畯甮畣町 界畕畁畉 畔畈畒畏畗
电由 #if defined(__cplusplus) && !defined(LUA_USE_LONGJMP)
电甲 /* C++ exceptions */
电申 #define LUAI_THROW(L,c) throw(c)
电甴 #define LUAI_TRY(L,c,a) \
电电 try { a } catch (...) { if ((c)->status == 0) (c)->status = -1; }
电甶 #define luai_jmpbuf int /* dummy variable */
电男
电甸 #elif defined(LUA_USE_ULONGJMP)
电甹 /* in Unix , try _longjmp/_setjmp (more efficient) */
甶田 #define LUAI_THROW(L,c) _longjmp ((c)->b, 1)
甶由 #define LUAI_TRY(L,c,a) if (_setjmp ((c)->b) == 0) { a }
甶甲 #define luai_jmpbuf jmp_buf
甶申
甶甴 #else
10这里涉及 C 调用层次上的系统堆栈保存和恢复问题。
11Java 就是这样,不用太考虑和原生代码的交互问题。
12一次纯粹的 Lua 函数调用,不会引起一次虚拟机上的 C 函数调用。
13用 C++ 开发的 Lua 扩展库,并不一定要链接到 C++ 编译的 Lua 虚拟机才能正常工作。如果你的库不必回调 Lua 函数,就不会有这个烦恼。
使用 try/catch 不会比 longjmp 更安全。如果你需要在 C++ 扩展库中调用 lua error 或 lua yield 中断 C 函数的运行,那么考虑到可能发生的内
存泄露问题,就有必要换成 try / catch 的版本。
- 上一篇: 协程及函数的执行-从0到1抖音运营变现手册大全
- 下一篇: 指令结构-从0到1抖音运营变现手册大全