2013-02-15 2 views
1

Win32에서 TerminateThread()을 사용하여 스레드를 죽일 수 있습니다. 하지만 내가 원하는 것은 그것을 수행 할 수있는 크로스 플랫폼 방법입니다.잠자기 모드 : 깨어나거나 정상적으로 종료하는 방법?

C++에서 어떻게 정상적으로 수행해야합니까?

+8

멀티 스레드 응용 프로그램 설계의 한 가지 규칙은 "스레드를 죽이지 말고 자살을 시도하지 마십시오." –

+0

왜 처음부터 너무 오랫동안 잠을 자고 싶습니까? – billz

+1

'main'이 sleep 대신에 레퍼런스를 가지고 있고 조건이 트리거를 리턴하면 조건 변수에서 시간 초과 대기를합니다. – ildjarn

답변

8

브로드 캐스트 신호, 세마포, 조건 변수 등에서 잠자기를하는 대신 잠자는 것이 좋습니다. 그런 다음 응용 프로그램이 신호를 설정하면 자 자이 깨어 나고 종료 할 수 있습니다. 스레드 본체가 잠금 해제를 포함하여 수행중인 작업을 정리할 수있는 기회를 제공하므로 훨씬 더 깔끔한 솔루션입니다!

응답이 특정 경우
업데이트는 accept를 호출하기 전에 타임 아웃 select를 호출합니다.

+0

원본 게시물의 예제 코드를 업데이트했습니다. 쓰레드는 시스템 제공 함수 내에서 블록되기 때문에 주어진 이벤트 객체를 기다릴 수 없다. – xmllmx

4

첫 번째 문제는 차단 모드 소켓 수락에서 비롯되며 비 차단 소켓 모드를 사용해야합니다.

당신은 예를 들어, While 루프에 플래그를 설정할 수 있습니다

struct AcceptHandler 
{ 
    AcceptHandler() 
    : is_terminated(false) 
    { 
    } 

    void accept() 
    { 
    while(!is_terminated) 
    { 
     // select 
     // accept 
     cout << " in loop " << endl; 
    } 
    } 

    void terminate() 
    { 
    is_terminated = true; 
    } 

private: 
    std::atomic<bool> is_terminated; 
}; 

int main() 
{ 
    AcceptHandler ah; 
    std::thread t(std::bind(&AcceptHandler::accept, std::ref(ah))); 
    t.join(); /// this is just demo, it blocks here 

    ah.terminate(); 

    return 0; 
} 

난 당신이 조건 변수 (선호하는 방법)를 사용할 수있는 샘플 (is_terminated) 플래그를 사용했다.

+0

쓰여진대로 is_terminated에 대한 데이터 경쟁이 있음을주의하십시오. – GManNickG

+0

@GManNickG 자세한 내용을 제공해주십시오. 당신은 합류하고 종결한다는 것을 의미합니까? – billz

+0

다른 스레드가 동시에 읽는 변수 (또는 쓰는 변수)가 데이터 경합입니다. 여기서'is_terminated'는 ('is_terminated = true')와 동시에 읽혀질 수 있습니다 ('while (! is_terminated)'). 'std :: atomic '(또는 뮤텍스로 보호되었지만 잔인 함)이어야합니다. – GManNickG

관련 문제