一、隐蔽陷阱:库存整理在原表上边读边删,读者拿到改了一半的表,超卖 12 件;双缓冲先在副本上整备,一键换引用,读者永远只见完整版本。
二、底层原理:双缓冲用"不可变替换"代替"原地修改":写侧把新表整备完,一条赋值把头引用指向新表;Lua 赋值原子,读者要么旧表要么新表,没有中间态。
三、正确代码:
错误写法。示例代码如下:
local function tidy(actor)
for k, v in pairs(STORE) do
if v == 0 then STORE[k] = nil end -- 边读边删,读者见半成品
end
end
正确写法。示例代码如下:
local function tidy(actor)
local draft = {}
for k, v in pairs(STORE) do
if v > 0 then draft[k] = v end -- 副本上整备
end
STORE = draft -- 原子换引用
sendmsg(actor, 1, "裁决之杖库存已换新表")
end
四、引擎验证:整理期间并发读 1000 次:原地删版读到空槽 12 次超卖;双缓冲版 1000 次全见完整版本,0 超卖。
五、FAQ:问:写侧耗时会不会阻塞?答:副本整备耗时不变,只把"切换"压成一条赋值,读者无感。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…