Project1

标题: 纤程的使用方法 [打印本页]

作者: wbsy8241    时间: 2012-1-30 17:43
标题: 纤程的使用方法
看了http://rpg.blue/thread-220654-1-1.html 还是看不懂啊

可否举个例子:
初始化a=0  b=100

纤程1 : a+=1
纤程2 : b-=1

当 a == b 的时候
返回结果:  约50dsu_plus_rewardpost_czw
作者: 答案    时间: 2012-1-30 17:55
本帖最后由 答案 于 2012-1-30 18:07 编辑

不,并不会这样……
当我们调用fiber.resume,就告知fiber:“你可以开始运行了”,我们就把控制权交给了fiber。

当调用纤程的时候即把控制权交由纤程。纤程从上至下执行一遍,若没有Fiber.yield的时候,会执行到结尾,然后将控制权交还。如果按照你这个例子的话那么最后 a 是不会等于 b 的,当然如果加上循环的确就是50了,这和直接写语句效果是一样的
如下代码的确可以将a,b变成50
  1. a = 0
  2. b = 100
  3. while(a != b)
  4.   Fiber.new{a+=1}.resume
  5.   Fiber.new{b-=1}.resume
  6. end
  7. msgbox "#{a},#{b}"
复制代码
但是这样并不可以:
  1. a = 0
  2. b = 100
  3. Fiber.new{a+=1}.resume
  4. Fiber.new{b-=1}.resume
  5. msgbox "#{a},#{b}"
复制代码
咱个人认为把纤程作为一种扩展的闭包就好了……纯粹个人意见
纤程和线程是不一样的:
  1. a = 0
  2. b = 100
  3. Thread.new{a += 1 while true}
  4. Thread.new{b -= 1 while true}
  5. p a,b while true
复制代码

作者: wbsy8241    时间: 2012-1-30 18:07
答案 发表于 2012-1-30 17:55
不,并不会这样……

当调用纤程的时候即把控制权交由纤程。纤程从上至下执行一遍,若没有Fiber.yield的时 ...


循环 a+=1 的时候
调用 b-=1 纤程 返回b 的值
在判断

这和循环差不多啊?


我要用来做寻路 需要2边都开始查找 碰上就返回路径= =
(1边开始查找的话 对面是死路就会循环整个地图...)
作者: 答案    时间: 2012-1-30 18:13
wbsy8241 发表于 2012-1-30 18:07

循环 a+=1 的时候
调用 b-=1 纤程 返回b 的值

这种寻路方式大丈夫么= =
参考多线程DP的话就是左边搜索一步,右边搜索一步,如果用线程的话很难控制两边的搜索速度保持一样什么的……
纤程的话大概就是一个纤程作为起点寻路的运算过程,另一个作为终点,然后两个各resume一下,比较当前搜索的坐标……
寻路的话还是踏踏实实好好学图论比较好
作者: 怕鼠的猫    时间: 2012-1-30 18:25
本帖最后由 怕鼠的猫 于 2012-1-30 18:31 编辑

我还是不写了吧。越来越复杂了。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1