完成端口多线程处理的一些问题,麻烦有经验的朋友看看 ( 积分: 200 )

  • 主题发起人 主题发起人 jamesdcs
  • 开始时间 开始时间
J

jamesdcs

Unregistered / Unconfirmed
GUEST, unregistred user!
当创建n个线程联系于完成端口。
1、此时如果一个客户端不断发送数据,究竟是一个线程在从完成端口读呢,还是几个线程都在读?对于单cpu的和多cpu的情况是否有所不同?

2、如果,此时是几个客户端同时发送数据,会不会出现“线程A读到client1的2k数据,然后读client2的,线程B读到client1的后2k数据,然后读client2的”这种情况。如果会,这种情况下要是把收到的数据保存到一个全局队列,是不是会出现同一个client的数据顺序混乱?

3、当收到数据后需要比较费时的处理,比如查询数据库(文件),此时应该把这些处理交给另外的线程池,那么在前后这2个线程池中,用什么方式交换数据比较合适?


 
当创建n个线程联系于完成端口。
1、此时如果一个客户端不断发送数据,究竟是一个线程在从完成端口读呢,还是几个线程都在读?对于单cpu的和多cpu的情况是否有所不同?

2、如果,此时是几个客户端同时发送数据,会不会出现“线程A读到client1的2k数据,然后读client2的,线程B读到client1的后2k数据,然后读client2的”这种情况。如果会,这种情况下要是把收到的数据保存到一个全局队列,是不是会出现同一个client的数据顺序混乱?

3、当收到数据后需要比较费时的处理,比如查询数据库(文件),此时应该把这些处理交给另外的线程池,那么在前后这2个线程池中,用什么方式交换数据比较合适?


 
这样的多线程应该是针对并发可以平行处理的数据,如果你的数据有顺序要求,这样处理并不合适,应该设置一个比较大的缓冲器,接收的数据达到可处理的数量后由另一个处理程序进行真正的保存,而不 是收到就进行保存,这样可以避免顺序混乱。
另外:一般一个线程连接上一个client后,直到断开,都是它在读这个client的数据,除非你读了一点数据就断开连接,其实并不会出现混乱的现象。
 
请问stlont,如果是多个cpu,会不会出现多个线程都读到一个socket一些数据情况?
张无忌,我搜索了一下这里的文章,你应该是一个高高手,能给我一些指点么?

谢谢各位回复。
 
还有朋友有此经验吗?
 
1.当然是几个线程都在工作(不一定都是读),多CPU不知道,没条件试
2.同时发数据不会混乱.只有可能是阻塞在那里(或是数据丢失!).
3.线程间交换数据的方式有很多种,比如内存映射.(当然在线程间一定要做好同步处理,如果另一个线程中只是读,可以不用同步).
 
当创建n个线程联系于完成端口。
1) 如果你为一同一个端口创建了多个工作线程,那么同用户的数据将被分发到不同的线程中去

2)因为1,所以这种情况很正常。实际上有个小窍门,即不是为同一端口创建多个工作线程,而是为服务创建多个单工作线程的完成端口,再按照用户的连入顺序均衡地绑定不同的端口就可以了。

3)如果数据处理存在较大的延迟的话,可以把数据请求打包丢到另一个请求队列线程中去进行异步的处理,在这里需要特别注意内存的管理,避免出现因工作时间长而导致的内存碎片问题。

另附送一条信息:
经过仔细的测试,发现windows的完成端口在该情况下会出现问题:
大量客户的连入,如5000人以上,并且和服务器不断地进行数据交互(频率足够快,如每秒10次收发)。
当连入的客户端在瞬间(零点几秒内)全部主动关闭连接时候,完成端口获得数据将会出现2到3条的差错。如,绑定了端口1的完成数据被端口2获取,某写完成消息被重复接受了两次等。呵呵,这个重大的隐患很可能导致服务端程序内存错误或者死循环,一定要仔细处理好。
 
GGCAT,你好,非常感谢答复,能否提供你的qq,有问题向你请教。
 
每个client连接上来之后的handle不一样,不会搞混的。
 
jamesdcs 有什么问题发email ggcat008@yeah.net 我很少上QQ的
 
谢谢各位的答复!
 

Similar threads

S
回复
0
查看
828
SUNSTONE的Delphi笔记
S
S
回复
0
查看
760
SUNSTONE的Delphi笔记
S
后退
顶部