自问自答

1.一个fiber中coroutine怎么知道自己要执行阻塞操作,放弃执行权力

一般都是在执行了一个周期后,完成了当前任务后,就立马放弃cpu,例如怪物AI中是将做出一轮扫描后,确定决策后放弃

 

2.lua中coroutine.resume是立即生效吗?立即放弃自己执行权力?

 立即生效的,而且coroutine不能resume自己,只能yield

coroutine.yield()

coroutine.resume()

这样操作无效

 

3.lua中coroutine.yield操作后,lua怎么选择下一个coroutine来执行?

 

4.为啥lua有resume和yield机制,已经能进行切换,此博客作者还自己实现了一套功能?

http://blog.csdn.net/sniperhuangwei/article/details/7015126

a = coroutine.create(function ()
print("aa")
coroutine.yield()
print("aa")
end)
coroutine.resume(a)
coroutine.resume(a)

其实博主的功能可以简单的表述如上,实例化coroutine并和其配合实现控制运行轨迹

 

5.内核多线程缺点

失去了代码的控制权,内核不了解用户态程序的实际情况就进行抢占,在某些场景下是不合理的,而且导致很多临界的地方,也易bug

http://blog.dccmx.com/2011/04/coroutine-concept/

 

6.fiber决定放弃的时机

a.进行了一轮的工作就放弃了 例如怪物扫描周边PC

b.异步化同步,调用阻塞函数,等待结果的反馈

 

7.一个极其简单的fiber

function monster(name)
while true do
print(name)
coroutine.yield()
end
end

c1 = coroutine.create(monster)
c2 = coroutine.create(monster)
c3 = coroutine.create(monster)
co = {}
table.insert(co, c1)
table.insert(co, c2)
table.insert(co, c3)

while true do
for k,v in pairs(co) do
print("for")
coroutine.resume(v, k)
end
end

没有处理当monster调用一个阻塞函数时,没有必要再次对它调用resume,怎么实现这套机制?

这就需要可运行列表和阻塞列表,进行列表切换。这里没问题是因为我们知道monster yield后,会立即变成可运行状态,所以下次直接resume,但阻塞调用消耗的时间就不知道了。需要

另一个机制。而且这里for也类似实现了一套列表间的切换,只不过我们没注意
http://blog.csdn.net/sniperhuangwei/article/details/5735610,如果要实现估计和pthread中条件变量类似

posted on 2012-03-16 09:10  brucexu  阅读(241)  评论(0编辑  收藏  举报