白话skynet第三篇:经过队列解决多线程竞争资源

今天遇到一个问题,在大厅服务中,若是一个请求使用到了一个公共的变量,如何保证其一致性?
虽然请求是挨个运行的,可是skynet.call会阻塞。git

“同一个 skynet 服务中的一条消息处理中,若是调用了一个阻塞 API ,那么它会被挂起。挂起过程当中,这个服务能够响应其它消息。这极可能形成时序问题,要很是当心处理。”
在其余语言中,好比c#,咱们使用lock的办法,把变量或者执行的代码锁起来。
在skynet中用下面的办法解决github

local sk_queue =  require "skynet.queue"
local cs = sk_queue()
把要执行的代码写到cs里面
cs(func1)
这样就好了。

相似的须要当心的还有 ipairs pairs的遍历。
遍历pairs的时候很是当心别变更pairs(t)里面的t的结构。
不然会发生一些莫名其妙的事情。有时间作作实验。c#

ipairs (t)
返回三个值(迭代函数、表 t 以及 0 ), 如此,如下代码函数

for i,v in ipairs(t) do body end

将迭代键值对(1,t[1]) ,(2,t[2]), ... ,直到第一个空值。ui

pairs (t)
若是 t 有元方法 __pairs, 以 t 为参数调用它,并返回其返回的前三个值。code

不然,返回三个值:next 函数, 表 t,以及 nil。 所以如下代码ip

for k,v in pairs(t) do body end

能迭表明 t 中的全部键值对。get

参见函数 next 中关于迭代过程当中修改表的风险。it

https://github.com/cloudwu/skynet/wiki/CriticalSectionio

相关文章
相关标签/搜索