如何在代码中重新启动多线程C ++程序?

时间:2013-05-19 08:44:18

标签: c++ multithreading

正如我在标题中所描述的那样,我希望在一个线程中有一个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 个答案:

答案 0 :(得分:3)

如果你想要从轨道上进行核武器处理(即你不想信任你的代码来可靠地进行受控关闭),那么在内部使用kill-and-auto-relaunch机制与其他代码相同的进程空间不是一种非常强大的方法。例如,如果其他一个线程崩溃,那么你的自动重启线程就会崩溃。

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

这样做的好处是,内存空间的分离可以保护你的重新启动程序代码免受其余代码中的任何错误的影响,并且杀死子进程意味着操作系统将处理所有内存清理和其他资源,所以对内存或文件句柄泄漏等问题的担忧较少。

答案 1 :(得分: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程序,并重新启动它)。 / p>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你可以分两部分来做:

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

第2部分:计算你想要的一个线程: 只要需要,这将“重新启动”该计划 这种“重新启动”包含一个大循环 在循环中:

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

  • 当布尔值设置为true

  • 时结束此操作
  • 创建另一个线程来替换然后被终止的线程

您的计划主要包括启动“检查程序”和“重新启动程序”

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