1

正如我在标题中描述的那样,我想在一个线程中有一个 if 语句,每 1 分钟检查一次,如果它是真的,重新启动整个程序。有什么建议吗?

void* checkThread(void* arg)
 {
   if(statement)
    //restart procedure
   sleep(60);
 }

 int main()
{
 pthread_create(&thread1, NULL, checkThread, main_object);
 pthread_create();
 pthread_create();
}
4

4 回答 4

3

如果您打算采用 nuke-it-from-orbit 方法(即您不想相信您的代码能够可靠地进行受控关闭),那么在与相同的进程空间内拥有 kill-and-auto-relaunch 机制其他代码不是一个非常健壮的方法。例如,如果其他线程之一崩溃,它会使您的自动重启线程随之停止。

更安全的方法是让您的自动重启线程在子进程中启动所有其他代码(通过 fork();调用 exec() 是允许的,但在这种情况下不是必需的)。60 秒后,父进程可以杀死它创建的子进程(通过在 fork() 返回的进程 ID 上调用 kill()),然后启动一个新进程。

这样做的好处是内存空间的分离可以保护您的重新启动器代码免受其余代码中的任何错误的影响,并且子进程的终止意味着操作系统将处理所有内存和其他资源的清理对您来说,因此不必担心内存或文件句柄泄漏等问题。

于 2013-08-14T00:09:21.017 回答
1

如果你想要一个“好”的方式来做,你设置一个标志,然后礼貌地等待线程完成,然后重新启动一切。

main_thread() {
  do {
    kill_and_restart_everything = false;
    // create your threads.
    pthread_create(&thread1, NULL, checkThread, main_object);
    pthread_create(&thread2, ...);
    pthread_create(&thread3, ...);
    // wait for your threads.
    pthread_join(thread1, nullptr);
    pthread_join(thread2, nullptr);
    pthread_join(thread3, nullptr);
  } while (kill_and_restart_everything);
}

void* checkThread(void* arg) {
  while (! kill_and_restart_everything) {
    if(statement)
      kill_and_restart_everything = true;
    else
      sleep(60);
  }
}

void* workerThread(void* arg) {
  // do stuff.  periodically check
  if (kill_and_restart_everything) {
    // terminate this thread early.
    // do it cleanly too, release any resources, etc (RAII is your friend here).
    return nullptr;
  }
  // do other stuff, remember to have that check happen fairly regularly.
}

这样,只要if(statement)为真,它将设置一个布尔值,可用于告诉每个线程关闭。然后程序等待每个线程完成,然后重新启动它。

缺点:如果您使用任何全局状态,则该数据将不会被清理并且可能会给您带来问题。如果一个线程没有检查你的信号,你可能会等待很长时间。

如果你想杀死所有东西(从轨道上用核弹攻击它)并重新启动,你可以简单地将这个程序包装在一个 shell 脚本中(然后它可以检测你想要的任何条件,杀死 -9 程序,然后重新启动它)。

于 2013-08-14T00:02:27.303 回答
0

您可以分两部分进行:

第 1 部分:一个线程检查语句并在需要重新启动程序时将布尔值设置为 true 这是“检查器”线程

Part2:一个计算你想要的线程:只要需要,这将“重新启动”程序这个“重新启动”包含一个大循环在循环中:

  • 创建一个将实际执行您的程序的线程(您要执行的任务)

  • 当布尔值设置为 true 时结束此任务

  • 创建另一个线程来替换然后一个被终止的线程

您的程序的主要内容包括启动“检查器”和“重新启动器”

如果您有任何问题/意见,请告诉我,我可以详细说明或添加一些代码

于 2013-08-13T20:21:22.553 回答
0

使用exec系统调用从程序开始重新启动进程。

于 2013-05-19T09:36:49.117 回答