У меня есть процесс worker
, который запускает executor
. Executor
- это процесс, который создает 10-секундную задачу и выполняет ее. Но после 2 сек. Работник убивает executor
процесс. SimGrid дает мне журнал после убийства executor
:Удалить незавершенную задачу в SimGrid
[ 2.000000] (0:[email protected]) 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:[email protected]) Oops ! Deadlock or code not perfectly clean.
[ 2.000000] (0:[email protected]) 1 processes are still running, waiting for something.
[ 2.000000] (0:[email protected]) Legend of the following listing: "Process <pid> (<name>@<host>): <status>"
[ 2.000000] (0:[email protected]) Process 2 (@Worker2)
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
Я ожидал, что simgrid покажет xbt_info
сообщение, но это не так, и прервал SIGABRT
ошибки.
Как я могу добраться до 'задачи' в' onexit'? –
Вы должны сохранить его в глобальном (или в MSG_process_set_data()), прежде чем приступить к его выполнению. Это намного проще, чем копать в внутренности SimGrid, чтобы потом получить его. –