liforget_bain 发表于 2010-10-15 10:39:34

IO线程和逻辑线程分离问题

有2条线程在完成端口上等待,也就是有2条线程执行handle_read_stream,当数据到达后,将数据包使用putq扔给逻辑处理线程。出现如下问题:逻辑处理线程处理数据的速度非常慢,N条逻辑线程全满,逻辑线程的消息队列已经达到了16K的水位线,而且putq是阻塞的吧,那么IO线程应该就会阻塞在那里,有什么方法可以解决此问题呢?

freeeyes 发表于 2010-10-15 11:14:27

这个会导致putq返回-1.线程不会等你的。
所以不会阻塞。

freeeyes 发表于 2010-10-15 11:15:10

忘了说,你putq可以设置超时时间。相信资料请看putq的第二个参数。

liforget_bain 发表于 2010-10-15 17:40:07

本帖最后由 liforget_bain 于 2010-10-15 17:42 编辑

回复 3# freeeyes
设置超时时间是不是就意味着要要放弃该数据库包呢?我的意思是这个数据包因为超时没有扔进逻辑线程中,该数据包是不是就要丢掉了,可不可以检查逻辑线程的负载性,如果都在忙碌则动态增加一线程,不知道这样做行不行?哪有例子啊?ACE_TASK能做到么?
还有一个问题没想好怎么做,就是文件传输问题,我是采用自定义包头的方式发送数据,先接受包头,后接受数据体,在单线程发送文件时将文件分割,包头记录每个块的大小,依次发送就行,我现在有以下问题不知道如何解决:
1接受端接收到发送文件的数据包后应该如何处理啊?我的意思我如果接受端IO线程接收到了发送文件的数据包,扔到逻辑线程中,逻辑线程解包,如果第一个数据包,则创建并打开文件,准备写入数据,可是完成该操作逻辑线程就要返回了,如果返回了,下一个文件传输包应该如果处理啊?难道要不断打开该磁盘文件,不断关闭该磁盘文件么?这里我搞的十分糊涂,版主帮帮我啊,应该怎么做啊?
2如果是多线程发送,如何才能排列这些数据包包顺序啊,如果发送端发送文件的顺序被打乱了,数据包2可于数据包1之前到达接受端,接受端应该怎样处理啊?

freeeyes 发表于 2010-10-15 18:26:00

可以使用ACE_TASK开启线程池,来满足你的这样的需求。
它会自动抢占任务的,如果putq失败了,说明你的工作线程数都在处理状态。
按照你的需求,完全可以使使用ace的线程池机制。建议可以看看《ACE程序员指南》
如果想看代码的话,可以看看我的开源服务器的代码。

liforget_bain 发表于 2010-10-15 19:07:23

本帖最后由 liforget_bain 于 2010-10-15 19:09 编辑

回复 5# freeeyes

感谢你的帮助,我已经下载你开发的开源服务器代码,可惜我使用vc6,不太好整合啊,我个人强烈希望你推出VC6版本的,我相信论坛里也有很多人使用VC6,另外,我问的文件传输的2个问题,我真的不知道怎么办才好,请再帮我一下。

文件传输问题,我是采用自定义包头的方式发送数据,先接受包头,后接受数据体,在单线程发送文件时将文件分割,包头记录每个块的大小,依次发送就行,我现在有以下问题不知道如何解决:
1接受端接收到发送文件的数据包后应该如何处理啊?我的意思我如果接受端IO线程接收到了发送文件的数据包,扔到逻辑线程中,逻辑线程解包,如果第一个数据包,则创建并打开文件,准备写入数据,可是完成该操作逻辑线程就要返回了,如果返回了,下一个文件传输包应该如果处理啊?难道要不断打开该磁盘文件,不断关闭该磁盘文件么?这里我搞的十分糊涂,版主帮帮我啊,应该怎么做啊?

2如果是多线程发送,如何才能排列这些数据包包顺序啊,如果发送端发送文件的顺序被打乱了,数据包2可于数据包1之前到达接受端,接受端应该怎样处理啊?

liforget_bain 发表于 2010-10-17 17:15:58

弄明白了,自己问的问题自己回答吧,也方便有相同问题的初学者。
1将打开文件的操作放在处理器中,逻辑线程调用指针就行。
2包的序列不会乱,多线程发送也同样调用一个处理器,只要传递的数据顺序不乱,所以不会乱序的。
页: [1]
查看完整版本: IO线程和逻辑线程分离问题