2016-08-08 6 views
0

executor을 실행하는 worker 프로세스가 있습니다. 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 오류로 중단 : 내가 코드를 실행하면

는 이제 있습니다.

답변

2

MSG_task_cancel() "죽이려는"작업을 수행해야합니다. MSG_process_on_exit() 콜백에 등록 된 함수에서이 작업을 수행 할 수 있습니다.

+0

'onexit' 함수에서'task'에 어떻게 접근 할 수 있습니까? –

+0

실행하기 전에 전역 (또는 MSG_process_set_data())에 저장해야합니다. 그 후에 SimGrid 내부를 검색하는 것이 훨씬 쉽습니다. –

2

다시 생각해 보면, 표시되는 메시지는 오류 메시지가 아니라 단순히 경고입니다. 안전하게 무시할 수 있습니다. 나는 프로세서가 죽을 때 자동으로 실행 된 태스크가 취소된다는 것을 확신한다.

그래서 일을하기 위해 아무 것도 할 필요가 없습니다. 그 메시지를 무시하십시오.

+0

작업을 취소하면 작업이 삭제됩니까? –