`
mryufeng
  • 浏览: 982370 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

lua coroutine是如何实现的?

    博客分类:
  • Lua
阅读更多
一直对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对象中。
顺着调用链 再看下源代码很容易就明白了。


分享到:
评论

相关推荐

    testco.zip_lua coroutine

    描述中提到的“test for lua coroutine and linux makecontext”揭示了测试的两个核心部分:一是Lua协程的实现与应用,二是Linux环境下的`makecontext`函数,这可能涉及到多线程或者上下文切换的概念。 **Lua协程...

    Lua_Coroutine

    Lua Coroutine,协程详解,lua 基本础,The Programming Language Lua

    Lua使用大全(详细介绍Lua这个脚本语言)

    Lua提供了C API,允许C/C++程序直接调用Lua代码,或者在Lua中调用C/C++编写的库,实现脚本语言与底层代码的无缝集成。 11. **在游戏开发中的应用** Lua因其小巧、高效和易于学习的特点,常被游戏开发者用于编写...

    Lua协同程序coroutine的简介及优缺点

    Lua协同程序,或称为coroutine,是一种轻量级的并发机制,它在Lua编程语言中扮演着重要的角色。不同于线程,协同程序在概念上更接近于子程序,但它们允许非阻塞的暂停和恢复,使得在单线程环境中实现异步操作成为...

    LUA - coroutine

    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 ...

    lua5.0的实现原理剖析

    4. 协程的加入:Lua 5.0 添加了协程(Coroutine)的概念,这是一种轻量级的并发模型,允许程序在不同执行流之间切换。尽管协程的概念并不新颖,但Lua 5.0 的实现使得协程易于理解和使用,有助于提升复杂程序的并行性...

    跑马灯抽奖Lua.zip

    5. **Lua的事件驱动编程**:跑马灯效果通常涉及到定时更新,这在Lua中可以通过定时器或者协程(coroutine)实现。定时器可以设定一个时间间隔后执行特定的函数,而协程则可以在执行过程中暂停和恢复,这对于创建非...

    基于Lua实现的脚本和服务器引擎Node-Lua.zip

    Node-Lua是一款基于Lua实现的脚本和服务器引擎,它支持构建海量Lua服务(Context_Lua)并以多线程方式运行在多核服务器上,采用了任务多路复用的设计方案,有效利用了多核优势。node-lua致力于构建一个快速、简单易用...

    lua脚本线程控制测试代码

    其中,Coroutine是Lua中的一个关键概念,它是协作式多任务的实现方式,而不是操作系统级别的线程。在Lua 5.1中,Coroutine提供了轻量级的并发机制,允许你在同一时间运行多个任务,而这些任务会交替地执行。 Lua的...

    lua程序设计及lua中文手册

    通过深入学习《Lua中文手册》,你可以掌握Lua的高级特性,如元编程、协程(coroutine)以及对C语言的接口(C API)进行扩展,进一步提升你的编程能力。 总结,Lua是一种强大的脚本语言,适用于游戏开发、自动化任务...

    nginx实战-基于lua语言

    1. **异步I/O**:Lua的coroutine(协程)配合Nginx的事件模型,可以实现非阻塞的I/O操作,例如异步访问数据库。 2. **Lua库集成**:通过luarocks安装第三方Lua库,如lua-cjson用于JSON操作,lua-resty-http进行HTTP...

    Lua Programming Gems 高清

    虽然Lua自身并不直接支持多线程,但可以通过协程(coroutine)来实现轻量级的并发。协程允许在单个线程内实现多任务切换,这对于某些场景下的并行处理非常有用。 最后,读者还能学到如何使用Lua进行游戏开发。Lua因...

    LUA程序设计参考文档

    LUA的协同程序(coroutine)是一种轻量级的并发机制,通过coroutine.create、coroutine.resume和coroutine.yield函数进行管理。虽然LUA不直接支持多线程,但在需要时,可以通过C/C++扩展或者配合外部库实现。 八、...

    Lua Programming Gems 英文版 pdf,高清

    6. **并发与协程**:Lua的协程(coroutine)提供了一种轻量级的并发模型,使得在单线程环境中实现并发变得简单。书中会详细介绍协程的工作原理和应用实例。 7. **嵌入与扩展**:Lua的设计初衷就是作为嵌入式脚本...

    lua大数据处理_大数据_lua_

    2. **并行处理**:虽然Lua自身不支持多线程,但可以通过coroutine(协程)实现轻量级的并发。在大数据处理时,可以将大任务分解为多个小任务,通过协程同时执行,提高处理效率。 3. **流式处理**:在处理大规模数据...

    Lua脚本支持库

    4. **并发与多线程**:虽然Lua本身不支持多线程,但可以通过Coroutine实现协作式多任务。Lrexlib库提供了对POSIX正则表达式的支持,配合Coroutine可以实现异步处理。 5. **数据库访问**:LuaJIT-FFI(Foreign ...

    LUA编程(programming in lua).pdf

    10. **协程(Coroutine)**:LUA支持轻量级的并发模型——协程。协程可以理解为合作式的线程,它们在单个线程中交替执行,提供了异步编程的能力。 通过阅读《LUA编程(programming in lua).pdf》,开发者不仅能了解LUA...

    Lua的协程(coroutine)简介

    总结来说,Lua的协程提供了一种轻量级的并发模型,通过`coroutine.create`、`coroutine.resume`和`coroutine.yield`的配合,可以在单线程环境中实现高效的多任务执行。协程的使用避免了线程切换的开销,简化了同步...

    翻译] Lua v5.1.4手册

    5. **元表(Metatables)**:元表是Lua中用于实现动态行为的关键机制,可以改变基本操作(如索引、相等性检查等)的行为。通过设置表的`__index`、`__newindex`等元方法,可以实现自定义的访问规则。 6. **垃圾回收...

    Lua 的实现,Lua使用者不能不看,脚本语言的经典啊。

    - Lua 通过 `coroutine.create`、`coroutine.resume` 和 `coroutine.yield` 等函数来管理协程的生命周期。 - 协程状态的变化由 Lua 虚拟机跟踪管理,确保每次都能正确恢复执行位置。 - **应用场景**: - **异步...

Global site tag (gtag.js) - Google Analytics