如果你想要一个“好”的方式来做,你设置一个标志,然后礼貌地等待线程完成,然后重新启动一切。
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 程序,然后重新启动它)。