删除 SimGrid 中的待处理任务

Delete pending task in SimGrid

我有启动 executor 的进程 workerExecutor 是一个创建 10 秒任务并执行它的进程。但是在 2 秒后,worker 杀死了 executor 进程。 SimGrid 在杀死 executor:

后给了我一个日志
[  2.000000] (0:maestro@) dp_objs: 1 pending task?

当另一个进程杀死当前工作进程时,我应该如何正确销毁任务和task_data

int worker(int argc, char *argv[])
{
    msg_process_t x = MSG_process_create("", executor, NULL, MSG_host_self());
    MSG_process_sleep(2);
    MSG_process_kill(x);
}

int executor(){
    MSG_process_on_exit(my_onexit, NULL);
    task = MSG_task_create("", 1e10, 10, NULL);
    MSG_task_execute(task);
    return 0;
}
int my_onexit() {
     MSG_task_cancel(task);
     XBT_INFO("Exiting now (done sleeping or got killed).");
     return 0;
}

UPD: 我声明了一个全局变量 msg_task_t task.

现在,当我 运行 代码时,我有:

[  2.000000] (0:maestro@) Oops ! Deadlock or code not perfectly clean.
[  2.000000] (0:maestro@) 1 processes are still running, waiting for something.
[  2.000000] (0:maestro@) Legend of the following listing: "Process <pid> (<name>@<host>): <status>"
[  2.000000] (0:maestro@) Process 2 (@Worker2)
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

我预计 simgrid 会显示 xbt_info 消息,但它没有显示 SIGABRT 错误并中断。

您应该 MSG_task_cancel() 您想要 "kill" 的任务。您可以在 MSG_process_on_exit() 回调中注册的函数中执行此操作。

再想一想,您看到的消息不是错误消息,而只是警告。您可以安全地忽略它。我很确定当处理器被杀死时,已执行的任务会自动取消。

所以你不需要做任何事情来让它工作,我会说。请忽略该消息。