读书人

求个真相-多线程。解决方法

发布时间: 2012-02-20 21:18:25 作者: rapoo

求个真相-多线程。
各位剑客黑客大侠前辈牛人老师,请帮助我看看我在某个帖子里面回答是否恰当。

话说那人问的是,server端怎么设计多线程。我平时都是写hello world 之类的程序突然间看见这么个话题,很感兴趣
于是上午重回答了下,就是没个人去指导下,我没做过那么高深的项目,只能意淫。难道大家都不怕我误导?

等了半天也不见有人拍砖,在见识今天一个哥们发生的丢包问题后,我也深深怀疑。我想知道,商业代码如果用多线程实现聊天室服务器端的话,大概个什么思路。
求教!谢谢

引用 5 楼 dontkissbossass 的回复:

。。。。。。。。。。。
3:Server多线程的话,我上边说的应该差不多了,比如要是我写的话,肯定有3类线程
3.1.1: 主线程
3.1.2: 接受消息线程
3.1.3: 发送消息线程

我肯定有以下数据结构
3.2.1 UI 以及在线socket 队列 //主线程 维护更新
3.2.2 消息队列(这是个桥梁,保存服务器没有传递完的聊天信息任务)//3.1.2 描述的线程操作:recv消息到的时候,往里添加
3.2.3 传递消息 //3.1.3描述的线程完成

PS:我没有做过这么大的项目,只是凭空想象,我甚至不知道这种结构和线程存在到底会不会增加性能。这只是一个假设。我目前的认识内,这是最好的了。。。(悲哀)

。。。。。。

高手评价下三。没做过,这设想成立么

http://topic.csdn.net/u/20100203/00/d7bc6c2b-0a4e-4db2-8e1b-77882e5006e9.html?84563

加个人气的也有分。

[解决办法]
那就加人气咯
[解决办法]
~
探讨
那就加人气咯

[解决办法]
来就人气的
[解决办法]
1, server端启动时是否本身就是启动多个线程来监听同一端口还是说server端启动后 如果有客户端连接才启动一个线程跟这个client端通信, 如果两个都可以 那么监听同一端口 他们是怎么做到互斥的

监听用一个线程就够了,其他的向客户端收发数据才需要多线程。有的时候如果是使用异步,如果数据量不大,甚至不需要用多线程。

2, server端的线程在获得数据后 如何下发给指定的client端的 会不会有好几个client端发送过来数据,线程在处理后 发送回给client端时出现顺序错误 比如:A client端请求的数据,在多线程server端处理后却发给了B client端,如何保证他们发送的正确呢

服务器端要对相应的数据进行保存,并且对应每个客户端保存一个数据,可以用map,key是客户端的socket,value是相应的数据。如果有多个相同的数据分包接收的话,就合并value,等保存完了,或者处理完了,再按照key,找到对呀的client端,发送数据回去。

3,如果第1个疑问是两个都可以的话 哪个好呢 另一方面 一般server端多线程是怎么做的, client端又是怎么做的 是不是client端也是多线程的呢

一般client端不需要多线程。用异步io就可以了。而服务器的多线程,可以做一个线程池。也是线程管理器,对各个任务(一般是IO操作)进行处理。

4,如果client端时多线程 server端也是多线程的话 那么client端多个线程发送数据给server端 那么server端又是如何保证返回给client端的线程数据顺序肯定是正确的呢

如上所述,client端是不需要用多线程的,而TCP连接是能够保证数据顺序的,所以这个不成问题。但要是udp的吧,就够呛,也许需要模仿tcp那样用一个包头标识封包,然后在服务器端那边判断包头顺序处理。服务器那边需要进行保存数据,然后排序处理了。


我来抛砖引出美玉。
[解决办法]
请参考Microsoft SDK\samples\netds\WinSock\iocp\IocpServer.Cpp
[解决办法]
几种方案 1 . socket+线程池,每个客户端连接一个线程;
2. iocp;
3. 采用事件模式;

对于大并发量可以采用适当的分布式结构。

[解决办法]
嘿嘿。。。 一般碰到涉及网络的 我都绕开,因为我不会网络那套

如果是多线程 多进程问题,我还可以讨论一下。。。
[解决办法]
so 友情up 。。。
[解决办法]
up
[解决办法]
lu guo xuexi

读书人网 >C++

热点推荐