当前位置: 首页 > 工具软件 > Coroutine > 使用案例 >

【Lua】【协同程序】【coroutine】知识点详解

魏勇军
2023-12-01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、定义

1. Lua的协同程序(coroutine)是什么?

参考runoob.com中对其的定义,可用线程来帮助理解。

lua协同程序与线程的共同点

  • 拥有独立的堆栈;
  • 独立的局部变量;
  • 独立的指令指针;
  • 与其他协同程序共享全局变量和其他大部分东西;

lua协同程序与线程的差异点:

  • 一个具有多线程的程序可以同时运行几个线程,但协同程序需要彼此协作的运行;
  • 在任意指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确被要求挂起时> > 才会被挂起;

协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。

每次一看到这种包含各种专有名词的定义或者概念就很头疼,因为我本来是想要通过这段说明了解某个未知事物,可是你却在说明文字里使用了另外的陌生词汇,你是嫌我脑袋上的问号还不够多是吗?
注:线程是操作系统能够进行运算调度的最小单位,一个进程中能够同时处理若干个线程。


二、应用方法

1.基本语法

方法描述
coroutine.create(f)创建一个coroutine,参数 f 是一个函数,当coroutine执行时会调用 f 函数。create()的返回的是一个类型为thread的coroutine对象,打印形如:thread:0xXXXXXXXX
coroutine.resume(c,…)参数 c 传入要执行的coroutine对象,c后的参数“…”会被传入到coroutine的执行函数中。首次调用从头开始;非首次调用从上一次程序挂起位置继续执行,此时传入的参数会传到上次调用coroutine.yield()的地方。当执行函数被挂起或者函数执行结束时返回值为true,执行错误会返回false,true/false后若有返回值,则是是函数的返回值或者调用coroutine.yield函数时传入的参数,例如 coroutine.yield(x, y, z),变量x, y, z会传给激活此次coroutine执行的resume()处,作为它的返回值看待
coroutine.yield()若在coroutine的执行函数中调用这个方法,函数执行将暂停,并将传入的参数返回本次调用的coroutine.resume()处 ;当下一次coroutine.resume()调用时,会把首参后的参数通通传到函数中上一次调用coroutine.yield()处,作为此处coroutine.yield()调用的返回值。
coroutine.status()传参为coroutine对象,返回此coroutine对象当前的状态。coroutine有三种状态:dead,suspended,running,基本上通过译意就知道是什么意思了
coroutine.wrap()创建一个coroutine对象,返回一个函数,调用此函数即可运行coroutine对象。调用函数时的传参会全部传到coroutine对象的执行函数中,调用后没有基础返回值,只有函数内有return值或者coroutine.yield()函数中有传参时才会有值返回
coroutine.running()调用后返回一个正在跑的coroutine对象,和coroutine.create()返回值一样,是一个类型为thread的内存地址,若没有正在跑的coroutine就返回nil

代码范例:


 类似资料: