3

我有一个进程启动几个线程来做一些事情,监听一些端口等。

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

它是这样的:

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

额外的sleep确保主线程不会吃掉处理器。

这种方法可以吗?是否有关于如何保持流程活力的行业标准?谢谢。

编辑:一些澄清:

  • 线程是侦听器,因此 a joinorWaitForSingleObject不是一个选项。通常我可以在这里使用 join,但是线程是由第三个客户端库启动的,我无法控制它们。
  • 从设计的角度来看,在主线程中进行一些处理没有意义。
4

3 回答 3

3

. 部分取自Linux Daemon Writing 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;
}

这样主进程将退出,子进程将产生线程来完成工作。最后,子进程将等待这些线程完成后再退出。

于 2012-05-01T08:15:35.107 回答
2

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

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

如果您使用 POSIX 线程,该pthread_join函数将执行此操作。

于 2012-05-01T07:53:15.213 回答
1

我不相信有行业标准

您所拥有的是一种完全可以接受的运行主线程的方式。但是,您可能希望包含一种跳出循环的方法。

其他方法包括:

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

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

于 2012-05-01T07:52:04.973 回答