博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
U3D的飞船太空射击例子中,使用coroutine
阅读量:5248 次
发布时间:2019-06-14

本文共 1042 字,大约阅读时间需要 3 分钟。

coroutine

 

线程是操作系统级别的概念,现代操作系统都实现并且支持线程,线程的调度对应用开发者是透明的,开发者无法预期某线程在何时被调度执行。基于此,一般那种随机出现的BUG,多与线程调度相关。

coroutine则是一个概念,windows上有所谓的fiber纤程实现,而好些语言中也自带coroutine的实现,比如Lua。与线程最大的不同是,coroutine的调度/挂起/执行开发者是可以控制的。另外coroutine也比线程轻量的多。要在语言层面实现coroutine,需要内部有一个类似栈的数据结构,当该coroutine被挂起时要保存该coroutine的数据现场以便恢复执行。
 
------------------------------------------------------------------------------------------
 

原理探析

  • coroutine创建的所谓的“线程”都不是真正的操作系统的线程,实际上是通过保存stack状态来模拟的。
  • 由于是假的线程,所以切换线程的开销极小,同时创建线程也是轻量级的,new_thread只是在内存新建了一个stack用于存放新coroutine的变量,也称作lua_State
  • 调用yield()当前线程交出控制权,同时还可以通过stack返回参数。调用resume的线程(可理解为主线程)获得返回的参数。
  • Lua yield()和Java中的Thread.yield()有点相似,但是区别更大。Java中的yield调用后只是将当前CPU切换到另外一个线程,CPU可能随时会继续回到线程执行。
  • 我更倾向于把Lua中的yield()和resume()和Java中的wait()和notify()来对比。它们表现的行为基本一致。

Why coroutine?

上面对coroutine有个基本的了解,因此大家都会象我一样去想,为什么要用coroutine?先研究下优点

  • 每个coroutine有自己私有的stack及局部变量。
  • 同一时间只有一个coroutine在执行,无需对全局变量加锁。
  • 顺序可控,完全由程序控制执行的顺序。而通常的多线程一旦启动,它的运行时序是没法预测的,因此通常会给测试所有的情况带来困难。所以能用coroutine解决的场合应当优先使用coroutine。

转载于:https://www.cnblogs.com/jiahuafu/p/4591495.html

你可能感兴趣的文章
2019春第六周作业
查看>>
js控件实现修改预览的功能
查看>>
endl用法
查看>>
如何学习linux操作系统
查看>>
我一定要把我stupid史纲论文发出来贻笑大方
查看>>
delphi主i窗口中实现多页面管理效果
查看>>
Nancy的基本用法
查看>>
新概念4-26
查看>>
剖析妻管严
查看>>
生成器与迭代器
查看>>
51NOD 1183编辑距离(动态规划)
查看>>
[UDP] UDP 报文数据(CoAP protocol)
查看>>
PAT L2-017 人以群分
查看>>
多线程下单例模式:懒加载(延迟加载)和即时加载
查看>>
ACM 竞赛高校联盟 练习赛 第六场 韩梅梅的抽象画(图论水题)
查看>>
Inheritance(Chapter 8 of Programming in Objective-C 2.0)
查看>>
mysql表结构文件
查看>>
tomcat报错:java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
查看>>
如何在AIX下安装JAVA
查看>>
较新版FlowPortal BPM不能回车登录
查看>>