lsxsoftr 发表于 2008-8-25 11:40:13

ACE_Svc_Handler 调用putq问题(急)

操作系统:redhat linux 9.0
ACE包:ACE5.5
我写的服务器程序使用了ACE_Acceptor,ACE_Svc_Handler,ACE_Reactor的组合通信框架。
当客户端程序发送第一个数据包到服务器的时候,服务器处理接收到的数据包后将回应给客户端的数据组包后在ACE_Svc_Handler派生类中调用this->putq(...)函数投递数据并注册写事件。数据成功地发送给客户端后,客户端接着给服务器发送第二个包。服务器处理第二个数据包的流程和处理第一个包的流程一样,然而,当再次调用this->putq(...)函数的时候,该函数并没有返回,似乎进入了死锁的状态。
奇怪的是同样的ACE5.5包和服务器程序代码放在debian下编译后却不会出现这样的情况。我猜想在redhat linux9.0下编译是不是有什么编译宏需要定义,而我没有给出定义。导致出现上述问题。请高手指点!谢谢!

[ 本帖最后由 lsxsoftr 于 2008-8-25 11:42 编辑 ]

winston 发表于 2008-8-25 14:13:58

看代码。
putq阻塞是有处理逻辑的,你能否跟着进去,看看阻塞到什么地方了。

lsxsoftr 发表于 2008-8-25 17:57:09

谢谢winston的回复!我也不太清楚,只是猜想是有关锁出了问题。后来我把模版参数改为ACE_NULL_MUTEX就没有问题了。能正常使用。我的代码被重构过,所以起初的设计框架和思想改变了,以至于后来出现这样的问题。原来是自己做应用数据缓存,多线程间共享一个消息队列所以用ACE_MT_MUTEX进行初始化模版。由于处理不好,所以后来就把它取消了。呵呵,我也不知道准确的原因,应该是这个ACE_MT_MUTEX参数误用了吧。反正现在是正常了。但是还有个问题我使用了ACE_SSL_SOCK_ACCEPTOR ,ACE_SSL_SOCK_STREAM,分别去实例化ACE_Acceptor,ACE_Svc_Handler。也就是使用了ACE封装好的OPENSSL。在ACE_Svc_Handle被调用handle_close的时候要怎么处理呢?也就是,需不需要调用SSL相关释放资源的函数呢?如果不调用,我发现内存是总在增长。所以,请问大家谁知道怎么处理呢?谢谢!

winston 发表于 2008-8-26 09:47:03

应该是锁应用的问题了。
SSL的那个我也没用过。
页: [1]
查看完整版本: ACE_Svc_Handler 调用putq问题(急)