线程安全

公司的新的pvp手游项目用了5个线程,分别是:主线程、迷雾线程、日志线程、游戏逻辑线程、Socket。

困而知之,所以和大家分享一下。

参考文章:
网络游戏服务器编程

Unity线程优先级(ThreadPriority)

  1. 优先级越高表示CPU分配给该线程的时间片越多,执行时间就多
  2. 优先级越低表示CPU分配给该线程的时间片越少,执行时间就少

实际上获得CPU时间长度与很多因素有关,不能仅靠优先级来判断。

环形缓冲区

不用频繁地分配内存,而在大多数情况下,内存的反复使用也使得我们能用更少的内存块做更多的事。

在网络io线程中,我们为每一个线程准备一个环形缓冲区,用于临时存放接收到的数据,以应付半包和粘包的情况。

在解包和解密完成之后,我们将这个数据包复制到逻辑线程消息队列中,如果我们只是用一个队列,那这里以后也将会是环形缓冲区,io线程往里面写,逻辑线程往后读,互相追逐,因为我们对同一个队列不会出现同时读和写的情况,每个队列在写满后交给逻辑线程去读,逻辑线程读完后清空队列再交给io线程去写,一段固定大小的缓冲区即可。

减少锁竞争次数

  1. 提供一个队列容器,里面有多个队列,每个队列都可固定存放一定数量的消息,网络线程要给逻辑线程投递消息时,会从队列容器中取一个空队列来使用,直到将该队列填满后再放回容器中换另一个队列。
    逻辑线程取消息时时从队列容器中取一个有消息的队列来读取,处理完成后清空队列再放回容器中。这样使得只有在队列容器进行操作时才需要加锁,而io线程和逻辑线程在操作自己当前使用的队列时都不需要加锁,所以锁竞争的机会大大减少了。
    可能会出现io线程未写满一个队列而逻辑线程又没有数据可处理的情况,特别是当数据量很少的时候出现。

  2. 使用两个队列,一个给逻辑线程读,一个给io线程写,当逻辑线程读完后将自己的队列和io线程的队列想调换。
    加锁的次数会比较多,io线程每次写队列时都要加锁,逻辑线程在调换队列时也要加锁,但逻辑线程在读队列时不需要加锁。

下午刚刚整理一下之前关于线程和进程的笔记。这里引用这个例子说明一下。

首先,因为没有开启新的进程,所以这五个线程都在一个进程中,这里谈谈我在开发中遇到的一些问题。

。。未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值