2014-02-09 3 views
0

STL 스레드가 수행해야 할 작업을 마친 후에 스레드를 종료하고 싶습니다. 또한 스레드가 완료 될 때를 알 수있는 방법이 있습니까? 이벤트 정도.자동 종료 C++ 11 STL 스레드

미리 감사드립니다.

답변

2

대신 스레드의 완료 상태를 폴링 할 수있는 방법을 원하는 경우 단순히 join으로 차단, 당신은 0 시간 제한 waiting에 의해 async하여 스레드를 생성 및 완료에 대한 반환 future를 폴링 수 :

void f() { 
    std::this_thread::sleep_for(std::chrono::seconds{2}); 
} 

int main() { 
    auto const zero = std::chrono::seconds{0}; 
    auto result = std::async(std::launch::async, f); 
    while (result.wait_for(zero) != std::future_status::ready) { 
    std::cout << "I'm still waiting...\n" << std::flush; 
    std::this_thread::sleep_for(std::chrono::milliseconds{100}); 
    } 
    result.get(); 
    std::cout << "Done.\n"; 
} 
+0

이것은 정확히 내가 찾고있는 것입니다. 감사. –

1

작업은 join라고 : 전화했을 때, 현재의 thread가 다른 스레드가 완료 될 때까지을 기다립니다 http://www.cplusplus.com/reference/thread/thread/join/

. 그처럼 간단합니다. 아무것도 더.

+0

내가는 C#을하고 싶은 등이 될 havior, 제 말은'join '을 사용하면 스레드가 완료 될 때까지 실행이 멈추고 코드의 다른 부분이 그 시간에 계속 실행되기를 원합니다. –

+0

메시지 대기열 + 메시지 처리기 또는 대기 상태에서 다른 작업을 실행하는 스레드가 두 가지 방법 만 사용할 수 있습니다. 문자 그대로 다른 방법이 없기 때문에 C#에서도 이렇게합니다. 믿지 않으면 C#의 "dispatcher"와 "default thread pool"에 대해 읽어보십시오. 여기서 가장 간단한 방법은 3 개의 스레드를 실행하는 것입니다. 하나는 "다른 작업"을위한 것이고, 다른 하나는 "어떤 시점에서 종료 할 스레드"를위한 것이고, 다른 하나는 "두 번째 스레드가 끝날 때까지 대기"를위한 것입니다. 그것은 '쓰레드 풀'방식입니다. – quetzalcoatl

+0

또는 ** ** 모든 메시지 대기열이있는 경우 두 번째 스레드에서 대기열로 메시지가 끝나기 전에 메시지를 게시하도록 할 수 있습니다. 메시지 프로세서는 메시지를 확인하고 완료됩니다. 그것이 '파견인'방식입니다. – quetzalcoatl

2

스레드는 함수 f의 끝을 얻을의 후 종료 될 wiil :

void f() 
{ 
    do_some_work(); 
    // end of function f 
} 

... 
{ 
    ... 
    std::thread t(f); 
    do_some_other_work(); 
    t.join(); 
} 

기능 join -> 블록의 현재 스레드를 스레드 t 멈출 때까지.

1

Like svetlovva 및 quetzalcoatl said : 결합 작업을 사용하여 스레드가 완료되었는지 확인하십시오.

그러나 블로킹 조인 작업을 사용하지 않고 스레드가 완료된 시점을 알고 싶으면 스레드를 분리하고 일부 전역 변수를 사용하여 스레드가 활성 상태인지 여부를 확인할 수 있습니다. 의사 코드 :

std::atomic<bool> imdone; 

void myThreadfunction() { 
    //dosomestuff; 
    imdone = true; 
    return; 
} 

int main() { 
    imdone = false; 
    std::thread t1(myThreadfunction); 
    t1.detach(); 

    //dosomeotherstuff 

    while(!imdone) { 
     //dosomeotherstuffwhilethreadisrunning 
    } 
} 

하지만 그건 당신이 독립적으로 실행하려는 각 스레드에 대한 글로벌 VAR를 사용하는 정말 좋은 아니에요 ...