Infinideastudio/NEWorld

线程是不是太多了?

Miigon opened this issue · 10 comments

现在在Mac Os X上运行客户端,线程数居然飙到了11?
而且内部有锁,造成的锁竞争较严重
这样在单核设备上是个噩梦

线程相关的bug可一点都不好调。。。

client+server内部线程一共就4个啊,还能怎么减
客户端渲染线程(主线程,launcher线程)
客户端网络线程
服务端网络线程(服务端的主线程)
服务端命令线程

11线程里应该有一些是我们管辖范畴之外的,比如Windows上移动窗口就会创建2个线程
但是个人觉得确实应该简化逻辑

确实。。。多的时候有二十几个线程。其实确定触发的线程目前不止四个。有主线程(GUI),客户端网络处理,客户端网络监听,服务端网络处理,服务端网络监听,服务端命令处理。以及因为使用了多线程运行库而在常规情况下多出的2-3个线程。按照逻辑来看目前应该至少能够切掉3个

客户端服务端处理和监听是一个线程,谢谢。其它线程都不是我们能控制的了。这四个也是最小了,没法减少了。

@abc612008 就是本地模式客户端直接访问服务端的储存,然后不启动commandmanager,就这样砍掉3个

这样简单不了,因为多人模式还是那么多线程

所以归类起来就是:
1.服务端命令线程只在单独运行服务端时启动
2.服务端网络线程在单人模式下不运行
3.客户端网络线程在单人模式下不运行
@abc612008 多人模式还是那么多,的确,但是多人模式一般不会启动在同一台机器上,即使会,不在同一进程内问题不大。

其实关于io部分的线程和锁问题,有一个解决方案,就是不用raknet,改用libuv+其他可靠udp库(或者对raknet进行libuv改造)
libuv对io有统一的调度,这就意味着服务端的命令输入(stdin),logger输出(stdout)网络(udp)三者可以使用同一个loop线程,节约了logger上的锁,并且把网络和命令输入两个线程合并成一个,还可以防止logger输出耗时对其他线程的影响(因为“输出”仅仅是把数据移动到了缓冲区,并没有立即调用io)

提示:SDLTimer有时会创建线程