一直对coroutine的运作原理不是很明白, 这几天琢磨了下终于搞明白了:
root@yfnix:~/lua-5.1.3/src# cat t.lua
a= coroutine.create(function ()
b= coroutine.create(function ()
coroutine.yield(1)
end)
coroutine.resume(b)
end)
coroutine.resume(a,1)
root@yfnix:~/lua-5.1.3/src# gdb --args lua t.lua
b lua_yield
r
bt
得到以下的调用stack
#0 lua_yield (L=0x80770b0, nresults=1) at ldo.c:446
#1 0x08064f7d in luaB_yield (L=0x80770b0) at lbaselib.c:592
#2 0x08050ac2 in luaD_precall (L=0x80770b0, func=0x8077b00, nresults=0) at ldo.c:319
#3 0x0805d2c8 in
luaV_execute (L=0x80770b0, nexeccalls=1) at lvm.c:587
#4 0x08050e11 in resume (L=0x80770b0, ud=0x8077b00) at ldo.c:404
#5 0x0804fec5 in luaD_rawrunprotected (L=0x80770b0, f=0x8050d56 <resume>, ud=0x8077b00) at ldo.c:116
#6 0x08050f61 in lua_resume (L=0x80770b0, nargs=0) at ldo.c:427
#7 0x08064c97 in auxresume (L=0x8076e90, co=0x80770b0, narg=0) at lbaselib.c:526
#8 0x08064d85 in luaB_coresume (L=0x8076e90) at lbaselib.c:545
#9 0x08050ac2 in luaD_precall (L=0x8076e90, func=0x8077818, nresults=0) at ldo.c:319
#10 0x0805d2c8 in
luaV_execute (L=0x8076e90, nexeccalls=1) at lvm.c:587
#11 0x08050e11 in resume (L=0x8076e90, ud=0x8077818) at ldo.c:404
#12 0x0804fec5 in luaD_rawrunprotected (L=0x8076e90, f=0x8050d56 <resume>, ud=0x8077818) at ldo.c:116
#13 0x08050f61 in lua_resume (L=0x8076e90, nargs=1) at ldo.c:427
#14 0x08064c97 in auxresume (L=0x8072008, co=0x8076e90, narg=1) at lbaselib.c:526
#15 0x08064d85 in luaB_coresume (L=0x8072008) at lbaselib.c:545
#16 0x08050ac2 in luaD_precall (L=0x8072008, func=0x807226c, nresults=0) at ldo.c:319
#17 0x0805d2c8 in luaV_execute (L=0x8072008, nexeccalls=1) at lvm.c:587
#18 0x08050d22 in luaD_call (L=0x8072008, func=0x8072260, nResults=-1) at ldo.c:377
#19 0x0804dbe7 in f_call (L=0x8072008, ud=0xbfaf3574) at lapi.c:801
#20 0x0804fec5 in luaD_rawrunprotected (L=0x8072008, f=0x804dbbd <f_call>, ud=0xbfaf3574) at ldo.c:116
#21 0x0805107e in luaD_pcall (L=0x8072008, func=0x804dbbd <f_call>, u=0xbfaf3574, old_top=48, ef=36) at ldo.c:463
#22 0x0804dc7b in lua_pcall (L=0x8072008, nargs=0, nresults=-1, errfunc=2) at lapi.c:822
#23 0x0804b3b9 in docall (L=0x8072008, narg=0, clear=0) at lua.c:102
#24 0x0804bc16 in handle_script (L=0x8072008, argv=0xbfaf38e4, n=1) at lua.c:250
#25 0x0804c0e5 in pmain (L=0x8072008) at lua.c:362
#26 0x08050ac2 in luaD_precall (L=0x8072008, func=0x807223c, nresults=0) at ldo.c:319
#27 0x08050d0b in luaD_call (L=0x8072008, func=0x807223c, nResults=0) at ldo.c:376
#28 0x0804dd5e in f_Ccall (L=0x8072008, ud=0xbfaf37ec) at lapi.c:847
#29 0x0804fec5 in luaD_rawrunprotected (L=0x8072008, f=0x804dcab <f_Ccall>, ud=0xbfaf37ec) at ldo.c:116
#30 0x0805107e in luaD_pcall (L=0x8072008, func=0x804dcab <f_Ccall>, u=0xbfaf37ec, old_top=12, ef=0) at ldo.c:463
#31 0x0804ddac in lua_cpcall (L=0x8072008, func=0x804bf61 <pmain>, ud=0xbfaf3830) at lapi.c:857
#32 0x0804c1b2 in main (argc=2, argv=0xbfaf38e4) at lua.c:387
lua的coroutine是通过c的堆栈来保存调用上下文的 多少个coroutine嵌套 就有多少个luaV_execute, 而lua的state保存存在lua_State,也就是thread对象中。
顺着调用链 再看下源代码很容易就明白了。
分享到:
相关推荐
test for lua coroutine and linux makecontext
Lua Coroutine,协程详解,lua 基本础,The Programming Language Lua
The concept of a coroutine is one of the oldest proposals for a general control abstraction. It is attributed to Conway [Conway, 1963], who described coroutines as “subroutines who act as the master ...
今天小编就为大家分享一篇关于Lua协同程序coroutine的简介及优缺点,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Node-Lua是一款基于Lua实现的脚本和服务器引擎,它支持构建海量Lua服务(Context_Lua)并以多线程方式运行在多核服务器上,采用了任务多路复用的设计方案,有效利用了多核优势。node-lua致力于构建一个快速、简单易用...
主要介绍了Lua协程(coroutine)程序运行分析,本文讲解分析了一段lua 协程代码是如何运行的,需要的朋友可以参考下
主要介绍了Lua的协程(coroutine)简介,本文讲解了coroutine的创建、协程的三种状态和yield函数的配合使用等内容,需要的朋友可以参考下
5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;6、运行期能编译字符串形式的程序文本并载入虚拟机执行;7、通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic ...
主要介绍了Lua之协同程序coroutine代码实例,本文给出的代码示例较为复杂,需要对Lua协同程序有一定的了解方能看懂,需要的朋友可以参考下
这是一个不对称的协程库(如lua)。 您可以先使用coroutine_open打开一个计划,然后在该计划中创建coroutine。 您应该在调用coroutine_open的线程中调用coroutine_resume,并且不能在同一调度中的协程中调用它。 ...
中关村 C#版本的LUA repo 主要是在 C# 中构建 LUA 5.2 的克隆,以便使具有脚本语言的 C# 项目能够扩展。 这包括 windows phone 项目、CoreCLR 项目。... 断言失败:big.lua nextvar.lua vararg.lua coroutine.lua
Cs2LuaCSharp代码转lua,适用于使用lua实现热更新而又想有一个强类型检查的语言的场合【示例链接】【用法】【设计与实现原理】【最新进展】【2021-02-26】 对象模型调整,实现层基于class来定位方法(避免元表按继承...
9.1 Coroutine Basics 73 9.2 Pipes and Filters 76 9.3 Coroutines as Iterators 79 9.4 Non-Preemptive Multithreading 81 10 Complete Examples 87 10.1 Data Description 87 10.2 Markov Chain Algorithm ...
提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作试多任务; 运行期间能编译字符串形式的程序文本并载入虚拟机执行; 通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic ...
协程 具有固定大小堆栈的非对称协程(类似 lua) 通过使用“ucontext”机制,堆栈大小在源代码中固定为 64KB,您可以在其中修改它。 现在支持linux(32&64)和win32,x86下测试。
参考:实现目标:通过对coroutine包装实现同步代码编写异步程序,lua代码实现[形式同步],c代码实现[实质异步]。开发模式:需求驱动##第一阶段工作:http1.1 预计三个月完成###模块####systemsystem.cpuinfo()@...
## coroutine_server 微型服务器的演示,该演示使用协程处理客户端连接。 ##协程 lua的强大概念 类似于线程 带有协程的程序仅运行其协程中的一个。 借助yield和resume的api,我们可以轻松地以syncen的编码样式...
在Neovim(> = 0.5)中使用fzf的异步Lua API。 允许UI速度和可用性完全异步。 预习: 请注意,在上面的示例中,信息是如何在neovim和fzf之间自由传递的。 Neovim将在fzf中选择的拆分中预览缓冲区。 使用该库,您...
TOSTRING COROUTINE GETMETATABLE RAWGET SELECT SETMETATABLE RAWEQUAL _VERSION PAIRS LOADFILE LOAD BIT32 IO OS RAWSET ERROR XPCALL REQUIRE DEBUG MATH STRING TABLE _G LOADSTRING MODULE UNPACK TONUMBER ...
来源: : 例子: ProFi = require ' ProFi ' ProFi: start () some_function () another_function () coroutine.resume ( some_coroutine ) ProFi: stop () ProFi: writeReport ( ' MyProfilingReport.txt ' )API:...