2017-11-28 1 views
0

스레드를 실행해야하는 프로그램이 있습니다. 문제는 스레드 내부 또는 스레드 외부에서이 스레드를 강제 종료하려고 시도 할 때마다 발생합니다. "오류 6 - 잘못된 핸들 "오류std :: thread를 죽일 수 없음

class myclass 
{ 
public: 
    static myclass* inst() 
    { 
     if (oInst == nullptr) oInst = new myclass; 
     return oInst; 
    }; 
    void main(); 

    void start(); 


    void ex_stop() 
    { 
     //HANDLE Stopper = Killer.native_handle(); 
     //TerminateThread(Stopper, 0); 
    } 
} 
private: 
    std::thread Killer; 

} 

void myclass::start() 
{ 
    Killer = std::thread(&myclass::ex_main, this); 
    Killer.detach(); 
} 

void myclass::main() 
{ 
    ... 
    if (0 == TerminateThread(Killer.native_handle(), 0)) 
    { 
      char error[200]; 


      sprintf(error, "error %i\n", GetLastError()); 

      printf(error); 
    } 

이것은 내가 클래스/스레드

myclass::inst()->start(); 

나는 또한 표준이 : 외부 (extern) 킬러 스레드 만들기 내 .CPP 및 .H 파일에 선언 해봤를 시작하는 방법, 이렇게하면 클래스 외부에서 액세스 할 수 있지만 여전히 "오류 6, 잘못된 스레드 핸들"오류가 발생합니다.

이 코드의 잘못된 점을 알려주실 수 있습니까? 고마워

+2

스레드를 '종료'하지 마십시오. 이제까지. 공유 자원이 잠겨 있거나 (아마도 새로운 내용 일 때) 쓰레드가 죽게되면 자원은 결코 잠금 해제되지 않습니다. 그리고 프로그램이 그냥 – UKMonkey

+0

을 걸어 놓기로 결정할 수도 있습니다. 위의 코드를 작동시키는 방법을 알고 있습니까? –

+3

분리하지 않은 것으로 생각하십니까? VisualC++ stdlib 구현에서 CloseHandle을 호출합니다. – PeterT

답변

1

작업자 스레드를 설정하는 일반적인 방법은 루프에 넣고 각 루프에서 부울 원자가 변경되었는지 확인하는 것입니다. '이 t은 똑바로 컴파일하며 threadMain 아마 바인딩해야합니다) 당신은 당신의 스레드가이 큐에 많은 작업을 수행 할 경우, 또는했다 적이 없다

class myThreadJob { 
    public: 

    myThreadJob(): 
    doRun(true), 
    thread(threadMain) 
    {} 

    void threadMain() { 
     while (doRun) {...} 
    } 

    void stop() { 
     doRun = false; 
     thread.join(); 
    } 

    private: 
    std::atomic<bool> doRun; 
    std::thread thread; 
} 

이 일회성이하고있어 그 일, 그러나 만약 어쨌든 오래 살아있는 스레드가 될 것으로 예상된다면, 그것은 계속 실행될 수 있다는 것을 주기적으로 점검해야합니다.

스레드에서 detach()를 호출 했으므로 스레드가 더 이상 프로세스와 관련되지 않습니다. detach()는 스레드가 생성 스레드에 대해 로컬이 필요 없다는 선언으로 생각할 수 있습니다. 가입 할 수 없습니다. 해지 될 것으로 기대하고 있습니다.

+0

흥미 롭 군, 나는 그것을 시도 할 것이다. 하지만 그건 내 주요 질문에 대답하지 않습니다 - 잘못된 핸들, 오류 6주고 원래 코드에서 잘못된 일을 해요. 내가 할 수 있어야 TerminateThread 사용하고 싶어도, 그래서 내 코딩 오류가 있습니다. 코드와 그것이 무엇인지 알고 싶습니다. –

+1

http://en.cppreference.com/w/cpp/thread/thread/detach 분리 호출은 더 이상 해당 스레드를 소유하지 않으므로 종료 할 수 없습니다. – UKMonkey