网游多线程模型

来源:互联网 发布:华钦软件 编辑:程序博客网 时间:2024/05/01 18:48

这个标题起的都点蛋痛,不过我很想用简单的几句话把这个问题说清楚,首先多线程访问肯定是要加安全锁的,多线程编程的数据保护就可以想象成一坨一坨的数据,每次使用数据都是其中的一坨,例如有1,2,3坨的数据,我们有一个线程,每次这个线程依次使用这3坨数据,那就没有必要加锁,假设我们现在有2个线程,同时使用这3坨数据,可能也不会有等待。如果n大于3的线程同时使用这3坨数据,假设每个线程占用的时间相等,那么必然有n-3个线程在等待。假设每个线程只使用一次并且使用的时间都是相等的,那么等待时间就是某个线程释放使用权限的时间。我们可以推算出系统运行的时间为,C(总运行时间)=N(线程数量)*T(线程占用时间)+VT(非使用互斥数据时间),

还是这3坨数据,如果不是依次访问,而是平均分为3个线程依次使用这个3坨数据,那么C(总运行时间)=N(线程数量)/D(数据数量)*T(线程占用时间)+VT(非使用互斥数据时间),明显总运行时间会下降。这个是假设每个线程每次只使用一坨数据如果每个线程使用Nd坨数据呢。例如数据有3坨,有两个线程,每个线程只同时使用其中的两陀数据。那么这两个线程需要等待的情况有两种也就是使用数据的交集,1个或2个,线程一使用1,2,线程2使用2,3那么只有在使用数据2时两个线程需要相互等待。如果都是同时使用12或23那么这两个线程都要依次等待,当然如果线程1在使用数据1时刚巧线程2在使用线程2而线程1释放线程2时线程2刚巧使用数据1.我承认这个可能性是一半对一半....很蛋痛。如果把n个线程和n个数据放在一起还能刚巧排好队吃果果的概率估计比你看完这篇文章下楼被雷劈死的概率低的多。

这里需要考虑这么几个变量之间的关系,第一是每个线程要访问的数据个数,第二是数据的坨数,第三访问锁的开销,第四是互斥的等待时间。考虑数据之间的关系,假设线程访问的数据个数相对固定,那么数据的坨数越多互斥等待的时间就越短,但访问锁的开销就越大。

按现在通常的编程习惯,数据的坨数和线程访问数据的数量都是不固定的,尤其是数据的坨数。最开始可能是一坨的数据,随着程序模块的扩大,变成了2坨3坨。。。的膨胀下去。每次线程锁住数据的坨数又不固定,即使划分了很多坨数据但性却变得非常脆弱。这也就是多线程模型下胡乱划分线程模型后容易导致的数据混乱。我想批判的是传统的按类别划分数据的习惯并不好。例如游戏中很容易吧技能的数据都放在技能哪一坨,地图的数据放在地图哪一坨。这样就很容易导致数据划分混乱和线程模型的不确定性,线程模型好比一个趋于混乱的模型,任何不幸的划分都会导致后面发展的混乱。对cpu线程来说他对逻辑类别和对待其他的数据是一样的,并不因为使用逻辑分类就更快。逻辑分类的缺点一目了然就是有大有小,但线程的时间片是固定的,这样就会容易造成访问大坨数据等待的线程多,小坨数据好久没人访问的尴尬。这里需要的更多的均衡,也就是充分的搅拌,如果数据和多线程是沙拉那么越是充分的搅拌也越美味。