线程的执行与中断-从0到1抖音运营变现手册大全

时间:2024-06-27 10:40:16
【文件属性】:

文件名称:线程的执行与中断-从0到1抖音运营变现手册大全

文件大小:2.13MB

文件格式:PDF

更新时间:2024-06-27 10:40:16

lua

电甸 第六章 协程及函数的执行 给 界 附加一些用户自定义信息在追求性能的环境很有意义。可以在为 界畵畡 编写的 畃 模块中,直接偏移 界 指针来获取一些附加信息。这比去读取 界 中的注册表要高效的多。另一方面,在多线程环境下,访问注册 表本身会改变 界 的状态,是线程不安全的。 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 的版本。


网友评论