自问自答
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中条件变量类似