找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5034|回复: 6

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

[复制链接]
发表于 2010-10-15 10:39:34 | 显示全部楼层 |阅读模式
有2条线程在完成端口上等待,也就是有2条线程执行handle_read_stream,当数据到达后,将数据包使用putq扔给逻辑处理线程。出现如下问题:逻辑处理线程处理数据的速度非常慢,N条逻辑线程全满,逻辑线程的消息队列已经达到了16K的水位线,而且putq是阻塞的吧,那么IO线程应该就会阻塞在那里,有什么方法可以解决此问题呢?
发表于 2010-10-15 11:14:27 | 显示全部楼层
这个会导致putq返回-1.线程不会等你的。
所以不会阻塞。
发表于 2010-10-15 11:15:10 | 显示全部楼层
忘了说,你putq可以设置超时时间。相信资料请看putq的第二个参数。
 楼主| 发表于 2010-10-15 17:40:07 | 显示全部楼层
本帖最后由 liforget_bain 于 2010-10-15 17:42 编辑

回复 3# freeeyes
设置超时时间是不是就意味着要要放弃该数据库包呢?我的意思是这个数据包因为超时没有扔进逻辑线程中,该数据包是不是就要丢掉了,可不可以检查逻辑线程的负载性,如果都在忙碌则动态增加一线程,不知道这样做行不行?哪有例子啊?ACE_TASK能做到么?
还有一个问题没想好怎么做,就是文件传输问题,我是采用自定义包头的方式发送数据,先接受包头,后接受数据体,在单线程发送文件时将文件分割,包头记录每个块的大小,依次发送就行,我现在有以下问题不知道如何解决:
1接受端接收到发送文件的数据包后应该如何处理啊?我的意思我如果接受端IO线程接收到了发送文件的数据包,扔到逻辑线程中,逻辑线程解包,如果第一个数据包,则创建并打开文件,准备写入数据,可是完成该操作逻辑线程就要返回了,如果返回了,下一个文件传输包应该如果处理啊?难道要不断打开该磁盘文件,不断关闭该磁盘文件么?这里我搞的十分糊涂,版主帮帮我啊,应该怎么做啊?
2如果是多线程发送,如何才能排列这些数据包包顺序啊,如果发送端发送文件的顺序被打乱了,数据包2可于数据包1之前到达接受端,接受端应该怎样处理啊?
发表于 2010-10-15 18:26:00 | 显示全部楼层
可以使用ACE_TASK开启线程池,来满足你的这样的需求。
它会自动抢占任务的,如果putq失败了,说明你的工作线程数都在处理状态。
按照你的需求,完全可以使使用ace的线程池机制。建议可以看看《ACE程序员指南》
如果想看代码的话,可以看看我的开源服务器的代码。
 楼主| 发表于 2010-10-15 19:07:23 | 显示全部楼层
本帖最后由 liforget_bain 于 2010-10-15 19:09 编辑

回复 5# freeeyes

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

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

2如果是多线程发送,如何才能排列这些数据包包顺序啊,如果发送端发送文件的顺序被打乱了,数据包2可于数据包1之前到达接受端,接受端应该怎样处理啊?
 楼主| 发表于 2010-10-17 17:15:58 | 显示全部楼层
弄明白了,自己问的问题自己回答吧,也方便有相同问题的初学者。
1将打开文件的操作放在处理器中,逻辑线程调用指针就行。
2包的序列不会乱,多线程发送也同样调用一个处理器,只要传递的数据顺序不乱,所以不会乱序的。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 17:27 , Processed in 0.017038 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表