【问题标题】:forcefully return from a method that called from a thread if thread itself exited如果线程本身退出,则从线程调用的方法强制返回
【发布时间】:2015-07-20 12:47:41
【问题描述】:

我使用一个 pthread 每 2 秒轮询一次网络。 为此,我从 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
  }
}

提出这个问题的基本思路是,对我来说,我的底层交互 TAO 2.0a 没有立即检测当前会话的网络故障,但在客户端它及时检测到它并启动另一个新会话进行连接。但一段时间后新旧会话都出现了 CORBA::COMM_FAILURE 异常,因此导致服务器和客户端的行为不稳定。 这是TAO的限制吗?或者我必须做点什么才能让它发挥作用。 如果有什么办法可以解决这里问题,请帮助我。

谢谢

【问题讨论】:

  • 不知道你的代码做什么或你的问题是什么。
  • 尝试创建 mcve 是有目的的。此外,我的 mcve 努力已经确定了我的错误。试一试。 (Q 数仍为 0,叹气。)
  • 也许您应该寻找解决问题原因的方法,这听起来像是超时问题。可能有一个 setsocketopt 来减少超时,然后您可以正确处理异常。
  • 嗨,理查德,谢谢,但我在这里面临的问题是网络已断开但 PingNetwork() 没有返回,如果我也使用超时,那么以后的新连接也会受到此影响。所以我希望在网络消失时让它正常返回。
  • 您应该设置 CORBA 消息传递超时策略以明确设置您希望等待回复的时间。现在你可能会得到一个 TCPIP 等待时间,30 秒或更长时间。

标签: c++ linux corba tao


【解决方案1】:

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

【讨论】:

  • Simon,我已经创建了没有任何选项的 pthread,所以这意味着它默认是可连接的。是的,如果在线程函数执行期间发生异常,我正在处理它。
  • 也许您应该在应用程序的 main() 中执行 try catch 语句来捕获所有内容。在那里设置一个断点,看看当异常发生时你捕捉到了什么。从那里您可以开始缩小您的问题范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多