2016-08-08 8 views
0

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.

Antwort

2

Sie sollten MSG_task_cancel() die Aufgabe, die Sie "töten" möchten. Sie könnten dies in einer Funktion tun, die im MSG_process_on_exit() Callback registriert ist.

+0

Wie erreiche ich 'task' in' onexit' Funktion? –

+0

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. –

2

Wenn Sie noch einmal darüber nachdenken, ist die angezeigte Nachricht keine Fehlermeldung, sondern lediglich eine Warnung. Sie können es sicher ignorieren. Ich bin ziemlich sicher, dass ausgeführte Aufgaben automatisch abgebrochen werden, wenn der Prozessor getötet wird.

Sie haben also nichts zu tun, damit es funktioniert, würde ich sagen. Ignoriere diese Nachricht einfach.

+0

Wird eine Aufgabe durch Abbrechen abgebrochen? –

Verwandte Themen