游戏服务端线程模型——无锁处理玩家请求

游戏服务端通常使用线程池处理玩家请求,但可能导致线程同步问题。本文探讨如何通过线程池组实现无锁处理,每个玩家请求固定分配给特定线程,避免同步和资源浪费。线程池大小略多于处理器数量,每个池仅含一个线程,类似Netty框架的线程模型,确保请求始终在固定线程中执行。
摘要由CSDN通过智能技术生成

一般来说,游戏服务端是采用线程池来处理所有玩家的业务请求。也就是说,在游戏服务端启动的时候,就初始一个足够大的线程池。这样,可以利用多核处理器的优势,提高业务处理能力。

但问题也随之而来,对于同一个玩家所发出的多个请求包,到了服务端可能被不同的线程同时处理,这里就出现了线程同步的问题。比较简单粗暴的解决方法是,每个玩家自带一个动作锁,当请求包上来的时候,立即将玩家的个人锁锁住。这样玩家的个人行为将从并行状态改成串行状态,也就解决了同步问题。但从本质而言,不一定所有请求都需要同步,多余的锁会消耗不必要的资源。

有没有一种方法可以实现,对于每一个玩家,都固定指派到指定线程。如此,对于每一个玩家的多个请求都将放到同一个消息队列。这些消息队列在固定的线程里按顺序执行,从而达到无锁处理玩家个人请求。

实现这一目标,典型的解决方案可以采用Actor消息模式,每一个玩家都设计为一个Actor,将对玩家的请求都发到该玩家的邮箱里。这里不作具体说明。

本文将采用线程池组的技术,说明如何优雅地解决该问题。

关于这个问题,我们只要能将角色请求通过某种关系,映射到给固定的线程执行即可。为此,我们可以初始化若干线程池,对于计算型的任务,可以将线程池的大小N设为略多于处理器的数量。但需要注意的是,我们不是初始化一个线程池࿰

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jforgame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值