2015-07-20 81 views
1

我已经每2秒使用一个pthread轮询网络。 为此,我从pthread的run()方法调用一个客户端接口。 但是当服务器和客户端之间的网络关闭时发生了什么,这个方法应该会抛出异常,但是现在不会发生这种情况。所以我计划的是强制返回这个方法并退出线程。强制从线程调用的方法返回,如果线程本身退出

为了实现这一点,我试图通过信号强制退出线程。 但我仍然面临的问题是,从线程本身退出后,客户端接口很晚才抛出异常。这导致我的实现中的行为不一致。

我的代码看起来像这样

//server side code 
//This is Linux code 

void ServerImp::run() 
{ 
    try { 
    while(1) 
    { 
    Client->PingNetwork() 
    } 
    } 
    catch(...) 
    { 
    //Handle exception 
    } 

} 

//PingNetwork implementation 
//This is Windows code 
void NetworkImpl::PingNetwork() throw exception 
{ 
    try{ 
    while(IsValidClient())//This will return as soon as client disconnected from server 
    { 
    sleep(2); 
    } 
    } 
    catch(...) 
    { 
    //Handle exception 
    } 
} 

基本思路问这个问题的是,对我来说我根本interace TAO 2.0A不会立即对当前会话检测网络故障,但是在客户端它检测到它很好并启动一个新的会话进行连接。但是,在某些时候,新旧会话都得到了CORBA :: COMM_FAILURE异常,因此导致服务器和客户端的行为不稳定。 这是TAO的限制吗?或者我必须做些事情才能使其发挥作用。 如果有什么方法可以在这里工作,请帮助我。

谢谢

+0

不知道你的代码做什么或者你的问题是什么。 –

+1

有一个尝试创建mcve的目的。另外,我的努力也证明了我的错误。试一试。 (Q计数仍为0,叹气。) –

+1

也许你应该看看解决问题的原因,这听起来像是超时问题。可能有一个setsocketopt来减少超时,然后你可以正确处理异常。 – Richard

回答

0

这听起来像你的武力退出线程不会干净地退出。一个干净的退出线程应该有所有的上下文被破坏,不会留下任何残留物。 pthread可以是可连接的也可以是分离的,您使用哪种类型的线程创建?在你的强制退出发生后,你的“客户”对象被销毁了吗?创建线程的逻辑怎么样,它是否处理僵尸线程的异常?自己回答所有这些问题,并处理所有这些细节。

+0

Simon,我创建了没有任何选项的pthread,所以它意味着默认情况下它将被连接。是的,我正在处理异常,如果它发生在执行线程函数期间。 –

+0

也许你应该在应用程序的main()处做一个try catch语句来捕捉所有东西。在那里设置一个中断点并查看发生异常时捕获的内容。从那里你可以开始缩小你的问题。 – simon