如何保持一个进程的运行?

3

我有一个进程,它启动了几个线程来完成某些工作,并监听一些端口等等。

当所有线程都启动后,主线程当前进入一个无限循环:

大致如下:

int main()
{
   //start threads
   while (true)
   {
      sleep(1000);
   }
}

额外的 sleep 确保主线程不会占用处理器资源。这种方法可行吗?有没有关于如何保持进程活动的行业标准?谢谢。
注:一些澄清: - 线程是监听器,因此joinWaitForSingleObject不是选项。通常在这里可以使用join,但线程由第三方客户端库启动,我对它们没有任何控制。 - 在主线程中进行一些处理在设计上没有意义。

你需要一种打破主循环的方法吗? - Nick
3
为什么加入线程不是一个选项?你只是不想在所有其他线程完成之前退出主线程。对所有tids调用join将实现这一点。 - Stan
所有的踩票是怎么回事?! - Nick
为什么不应该加入一个监听器线程? - peoro
@Stan,你说得对,通常它应该可以工作。我编辑了问题。 - AMCoder
3个回答

3

以下内容部分参考自Linux守护进程编写HOWTO,我假设您希望得到这样的结果:

int main() {
    pid_t pid;

    /* Fork off the parent process */       
    pid = fork();
    if (pid < 0) {
            exit(EXIT_FAILURE);
    }
    /* If we got a good PID, then
       we can exit the parent process. */
    if (pid > 0) {
            exit(EXIT_SUCCESS);
    }
    // now start threads & do the work

    for( thread *t : threads ) {
            join( t );
    }

    return 0;
}

这样主进程将退出,子进程将创建线程以执行任务。最终, 子进程将等待这些线程完成后再退出。

+1:除非O.P.提到了WaitForSingleObject,这表明他正在使用Windows平台。 - Nick
@Nick 你说得对,我应该注意到这个问题。虽然使用CreateProcess也可能做类似的事情,但我会把这留给其他人处理 :-) - Stan

2

我建议您让主线程等待其他线程的终止:

int main( ) {
  // start threads
  for( thread *t : threads ) {
    join( t );
  }
  // finalize everything or restart the thread
  return 0;
}

如果您正在使用POSIX线程,则可以使用pthread_join函数来完成此操作。

1

我不相信有一个行业标准。

你现在的主线程运行方式是完全可接受的。但是,你可能想要包含一种方法来跳出循环。

其他方法包括:

  • 使用 join 命令等待所有工作线程完成。
  • 在主线程中等待一个 event,可以发出信号退出循环。
  • 使用主线程执行一些当前由工作线程执行的处理。
  • 定期检查布尔标志以决定是否退出。

归根结底,这取决于你的具体要求。


如果你只想让线程一直运行,那么你所做的没有任何问题。但是,如果你想要一种干净退出的方式(即不通过进程终止),那么你需要一种当前解决方案所没有的方法。 - Nick
我取消了我的反对票,因为我太匆忙了。我认为原因是答案中的第一句话是“没有行业标准!”即使你的回答其余部分是正确的,它也给了我一种“错误”的感觉。是的,我们可能没有行业标准,但是处理进程和线程的最佳实践确实存在。也许下次在这样的陈述中少些绝对性? - Stan
@Stan:说得好,我的话有点直白了!我修改了它!谢谢。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接