白話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

相關文章
相關標籤/搜索