lua的协同程序

本文介绍了Lua中的协同程序(coroutine),包括其与线程的区别、工作原理及如何在Lua中使用协同程序。协同程序允许程序在等待资源时挂起并让出CPU资源,从而提高程序的整体效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协同程序(coroutine)与线程比较类似:拥有独立的堆栈独立的局部变量,独立的指令指针,但是和其他协同程序共享全局变量等很多信息。
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同
程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协作程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

lua提供的是非对称的完整的协同程序,用两个函数控制,一个挂起,一个恢复运行。可实现对称的协同程序。协同程序提供了一种协作式的多线程,每个协同程序都等于一个线程,一对yield-resume可以将执行权在不同线程之间切换。与常规多线程相比,是非抢占式的,无法从外部停止一个协同程序,只有当协同程序显式的要求挂起时,它才会停止。

lua将所有关于协同程序的函数放入名为“coroutine”的table中,函数create创建新的协同程序,它只有一个参数,该函数的代码是协同程序所需执行的内容;create会返回一个thread类型的值,用于表示新的协同程序;通常create的参数是一个匿名函数。

协同程序的四种状态:挂起(suspended),运行(running),死亡(dead),正常(normal)。

当创建一个协同程序时,处于挂起状态,不会自动执行内容。可以通过status来检查协同程序的状态。coroutine.status(x)

挂起态:创建一个协同程序时他开始的状态为挂起态,函数coroutine.yield可以使程序由运行态变为挂起状态,之后还可以再恢复其运行。

运行态:函数coroutine.resume可以使程序由挂起状态变为运行态,resume在保护模式中运行。

死亡态:协同程序结束,进入停止态。

当一个协同程序唤醒另一个协同程序时,其处于正常态。

   协同和顺序执行的区别?任一制定时刻只能运行一个协同程序,这个和顺序执行区别在哪?关键在于yield函数。如果顺序执行的时候进行耗费cpu时间或者一直等待某个资源的时候,程序将卡在这个地方不能前进。协同程序的出现就是可以使等待资源的线程让出资源,进行下一个协同程序的操作。yield可以在执行出错的时候挂起,下次恢复的时候再进行操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值