一直对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协程的实现与应用,二是Linux环境下的`makecontext`函数,这可能涉及到多线程或者上下文切换的概念。 **Lua协程...
Lua Coroutine,协程详解,lua 基本础,The Programming Language Lua
Lua提供了C API,允许C/C++程序直接调用Lua代码,或者在Lua中调用C/C++编写的库,实现脚本语言与底层代码的无缝集成。 11. **在游戏开发中的应用** Lua因其小巧、高效和易于学习的特点,常被游戏开发者用于编写...
Lua协同程序,或称为coroutine,是一种轻量级的并发机制,它在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 ...
4. 协程的加入:Lua 5.0 添加了协程(Coroutine)的概念,这是一种轻量级的并发模型,允许程序在不同执行流之间切换。尽管协程的概念并不新颖,但Lua 5.0 的实现使得协程易于理解和使用,有助于提升复杂程序的并行性...
5. **Lua的事件驱动编程**:跑马灯效果通常涉及到定时更新,这在Lua中可以通过定时器或者协程(coroutine)实现。定时器可以设定一个时间间隔后执行特定的函数,而协程则可以在执行过程中暂停和恢复,这对于创建非...
Node-Lua是一款基于Lua实现的脚本和服务器引擎,它支持构建海量Lua服务(Context_Lua)并以多线程方式运行在多核服务器上,采用了任务多路复用的设计方案,有效利用了多核优势。node-lua致力于构建一个快速、简单易用...
其中,Coroutine是Lua中的一个关键概念,它是协作式多任务的实现方式,而不是操作系统级别的线程。在Lua 5.1中,Coroutine提供了轻量级的并发机制,允许你在同一时间运行多个任务,而这些任务会交替地执行。 Lua的...
通过深入学习《Lua中文手册》,你可以掌握Lua的高级特性,如元编程、协程(coroutine)以及对C语言的接口(C API)进行扩展,进一步提升你的编程能力。 总结,Lua是一种强大的脚本语言,适用于游戏开发、自动化任务...
1. **异步I/O**:Lua的coroutine(协程)配合Nginx的事件模型,可以实现非阻塞的I/O操作,例如异步访问数据库。 2. **Lua库集成**:通过luarocks安装第三方Lua库,如lua-cjson用于JSON操作,lua-resty-http进行HTTP...
虽然Lua自身并不直接支持多线程,但可以通过协程(coroutine)来实现轻量级的并发。协程允许在单个线程内实现多任务切换,这对于某些场景下的并行处理非常有用。 最后,读者还能学到如何使用Lua进行游戏开发。Lua因...
LUA的协同程序(coroutine)是一种轻量级的并发机制,通过coroutine.create、coroutine.resume和coroutine.yield函数进行管理。虽然LUA不直接支持多线程,但在需要时,可以通过C/C++扩展或者配合外部库实现。 八、...
6. **并发与协程**:Lua的协程(coroutine)提供了一种轻量级的并发模型,使得在单线程环境中实现并发变得简单。书中会详细介绍协程的工作原理和应用实例。 7. **嵌入与扩展**:Lua的设计初衷就是作为嵌入式脚本...
2. **并行处理**:虽然Lua自身不支持多线程,但可以通过coroutine(协程)实现轻量级的并发。在大数据处理时,可以将大任务分解为多个小任务,通过协程同时执行,提高处理效率。 3. **流式处理**:在处理大规模数据...
4. **并发与多线程**:虽然Lua本身不支持多线程,但可以通过Coroutine实现协作式多任务。Lrexlib库提供了对POSIX正则表达式的支持,配合Coroutine可以实现异步处理。 5. **数据库访问**:LuaJIT-FFI(Foreign ...
10. **协程(Coroutine)**:LUA支持轻量级的并发模型——协程。协程可以理解为合作式的线程,它们在单个线程中交替执行,提供了异步编程的能力。 通过阅读《LUA编程(programming in lua).pdf》,开发者不仅能了解LUA...
总结来说,Lua的协程提供了一种轻量级的并发模型,通过`coroutine.create`、`coroutine.resume`和`coroutine.yield`的配合,可以在单线程环境中实现高效的多任务执行。协程的使用避免了线程切换的开销,简化了同步...
5. **元表(Metatables)**:元表是Lua中用于实现动态行为的关键机制,可以改变基本操作(如索引、相等性检查等)的行为。通过设置表的`__index`、`__newindex`等元方法,可以实现自定义的访问规则。 6. **垃圾回收...
- Lua 通过 `coroutine.create`、`coroutine.resume` 和 `coroutine.yield` 等函数来管理协程的生命周期。 - 协程状态的变化由 Lua 虚拟机跟踪管理,确保每次都能正确恢复执行位置。 - **应用场景**: - **异步...