如何通过多线程避免C++中的挂起处理

rec*_*ion 2 c++ multithreading

在我的代码中,主循环如下所示

while ( (data = foo()) != NULL ) {
    // do processing on data here
}
Run Code Online (Sandbox Code Playgroud)

其中foo()用C语言编写(它使用libavcodec获取视频流中的下一帧,如果你很好奇的话).

我的问题是,由于原因太复杂而无法进入,有时会foo()挂起,这会停止整个程序.我想要做的是检测这种情况,即foo()花费超过N秒,如果是这样,采取行动.

我想创建一个单独的线程来运行foo()来实现这一点我之前没有做过任何多线程编程.这就是我想要做的事情:

  1. 主线程创建一个子线程并调用 foo()
  2. foo()完成后,子线程返回
  3. 主线程处理返回的数据 foo()
  4. 如果子进程超过指定的时间,则主线程采取动作.
  5. 只要foo()不返回null,重复步骤1-4 ,这表示结束.

我该怎么做呢?我需要三个线程(主线程,运行foo()和时序)吗?

谢谢!

Jer*_*fin 6

这非常难以做好.问题是foo挂起时你要做的事情.几乎你唯一可以做的就是中止程序(不仅仅是线程)并重新开始 - 杀死线程并尝试重新启动它可能会起作用,但它充其量是危险的.当您终止进程时,操作系统将清理资源,但是当您终止单个线程时则不会.基本上不可能弄清楚哪些资源专属于该线程,以及可能与该进程中的其他线程共享的内容.

在这种情况下,也许你可以将易于悬挂的部分移动到一个单独的进程,并在/如果它挂起时杀死/重启该进程?然后,您将通过一些正常形式的IPC(例如,管道)将数据发送到父进程.在这种情况下,您可以在父(处理器和看门狗)中有两个线程,或者(如果可用)您可以在超时的情况下执行某种异步读取,并在/如果读取超时(仅使用一个)时终止子进程线).