Ich habe Prozess worker
, die executor
startet. Executor
ist ein Prozess, der eine 10-Sekunden-Aufgabe erstellt und ausführt. Aber nach 2 Sekunden Arbeiter tötet executor
Prozess. SimGrid gibt mir ein Protokoll nach executor
Tötung:Löschen ausstehende Aufgabe in SimGrid
[ 2.000000] (0:[email protected]) dp_objs: 1 pending task?
Wie soll ich richtig Aufgaben zerstören und task_data
wenn ein anderer Prozess zur Zeit Arbeitsprozess töten?
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: erklärte ich eine globale Variable msg_task_t task
. Jetzt
, wenn ich Code ausführen ich habe:
[ 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)
ich, dass simgrid erwartet xbt_info
Nachricht zeigen würde, aber es kam nicht und mit SIGABRT
Fehler unterbrochen.
Wie erreiche ich 'task' in' onexit' Funktion? –
Sie müssen es in einem globalen (oder in MSG_process_set_data()) speichern, bevor Sie es ausführen. Das ist viel einfacher, als in den SimGrid-Interna zu graben, um es danach wieder zu finden. –