白話skynet第三篇:通過隊列解決多線程競爭資源


今天遇到一個問題,在大廳服務中,如果一個請求使用到了一個公共的變量,如何保證其一致性?
雖然請求是挨個運行的,但是skynet.call會阻塞。

“同一個 skynet 服務中的一條消息處理中,如果調用了一個阻塞 API ,那么它會被掛起。掛起過程中,這個服務可以響應其它消息。這很可能造成時序問題,要非常小心處理。”
在其他語言中,比如c#,我們使用lock的辦法,把變量或者執行的代碼鎖起來。
在skynet中用下面的辦法解決

local sk_queue =  require "skynet.queue"
local cs = sk_queue()
把要執行的代碼寫到cs里面
cs(func1)
這樣就行了。

類似的需要小心的還有 ipairs pairs的遍歷。
遍歷pairs的時候非常小心別變動pairs(t)里面的t的結構。
否則會發生一些莫名其妙的事情。有時間做做實驗。

ipairs (t)
返回三個值(迭代函數、表 t 以及 0 ), 如此,以下代碼

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

將迭代鍵值對(1,t[1]) ,(2,t[2]), ... ,直到第一個空值。

pairs (t)
如果 t 有元方法 __pairs, 以 t 為參數調用它,並返回其返回的前三個值。

否則,返回三個值:next 函數, 表 t,以及 nil。 因此以下代碼

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

能迭代表 t 中的所有鍵值對。

參見函數 next 中關於迭代過程中修改表的風險。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM