2013-04-25 4 views
1

일부 작업을 수행 할 다른 스레드를 만드는 주 스레드가 있습니다. 주 스레드는 해당 스레드에 대한 참조를 가지고 있습니다. 스레드가 여전히 작동 중이더라도 강제로 그 스레드를 강제 종료하려면 어떻게해야합니까? 내가 할 수있는 적절한 함수 호출을 찾을 수 없습니다.다른 스레드에서 스레드를 죽이는 방법

도움이 될만한 것 같습니다.

원래 해결해야 할 문제는 스레드를 생성하여 스레드를 완료하여 1 초가 걸리거나 10 시간이 걸리는 CPU 바운드 작업을 수행하는 것입니다. 얼마나 많은 시간이 걸릴지 예측할 수 없습니다. 시간이 너무 오래 걸리는 경우, 내가 원할 경우 정상적으로 업무를 포기하고 싶습니다. 어떻게 든이 메시지를이 스레드와 통신 할 수 있습니까?

+0

왜 당신이 스레드를 죽이고 싶어합니까? 너 정말로 무엇을하려고하는거야? – razeh

+0

내가 원하는 것을 설명하기 위해 문제 문을 편집했습니다. – imagin

+0

Appart가 새기고 있음을 알 수없는 상태로 많은 데이터를 남겨두고 있습니다. 그것은 거의 좋은 생각이 아닙니다. 중지 할 스레드에 신호를 보내고 중지 요청을 확인하십시오. –

답변

3

당신이 GLib.Thread에 대해 말하고 있다고 가정하면, 그렇게 할 수 없습니다. 비록 당신이 할 수 있더라도, 당신은 아마도 당신이 상당한 양의 메모리를 새기게 될 가능성이 있기 때문에, 그러고 싶지 않을 것입니다.

당신이해야 할 일은 스레드가 스스로를 죽일 것을 요구하는 것입니다. 일반적으로 이것은 가장 빠른 기회에 작업이 중지되도록 요청되었는지 여부를 나타내는 변수를 사용하여 수행됩니다. GLib.Cancellable은이를 위해 설계되었으며 GIO의 I/O 연산과 통합됩니다.

예 :

private static int main (string[] args) { 
    GLib.Cancellable cancellable = new GLib.Cancellable(); 
    new GLib.Thread<int> (null,() => { 
     try { 
     for (int i = 0 ; i < 16 ; i++) { 
      cancellable.set_error_if_cancelled(); 
      GLib.debug ("%d", i); 
      GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 100); 
     } 

     return 0; 
     } catch (GLib.Error e) { 
     GLib.warning (e.message); 
     return -1; 
     } 
    }); 

    GLib.Thread.usleep ((ulong) GLib.TimeSpan.SECOND); 
    cancellable.cancel(); 

    /* Make sure the thread has some time to cancel. In an application 
    * with a UI you probably wouldn't need to do this artificially, 
    * since the entire application probably wouldn't exit immediately 
    * after cancelling the thread (otherwise why bother cancelling the 
    * thread? Just exit the program) */ 
    GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 150); 

    return 0; 
} 
+0

여기에서 우리는 모든 루프에서 cancellable.set_error_if_cancelled()를 확인하여 이미 취소되었는지 확인해야합니다. 새 스레드가 시작될 때 작업을 취소 할 때 취소 될 수 있도록 새로운 스레드가 시작될 때 무엇인가 할 수 있습니까? 공연은이 유형의 간단한 루프를 가지고 있지 않다. 나는 그것을 확인할 수있다. 각 의미있는 코드 블록 다음에이 조건을 검사 할 수 없다. – imagin

+0

아니요. 각각의 의미있는 코드 블록 이후에 체크 할 수없는 이유는 무엇입니까? 스레드 콜백에서 호출하는 모든 메서드에 취소 가능 함수를 전달하고 예외를 throw하도록합니다. 그렇다면 가끔 cancelable.set_error_if_cancelled()를 호출하는 것이 전부입니다. 그리 대단히 어렵지는 않습니다. – nemequ

+1

아마도 당신은 틀린 질문을하고 있습니다. 스레드를 죽이는 방법을 묻는 대신 (말했듯이, glib 스레드로), 오랫동안 CPU를 집중적으로 사용하는 작업을 수행하는 방법을 묻는 것이 좋습니다. t) 취소 할 수있는 코드를 수정하십시오. 어떤 경우에는 스레드가 아닌 프로세스를 사용하는 것이 좋습니다. – nemequ

관련 문제