STL 스레드가 수행해야 할 작업을 마친 후에 스레드를 종료하고 싶습니다. 또한 스레드가 완료 될 때를 알 수있는 방법이 있습니까? 이벤트 정도.자동 종료 C++ 11 STL 스레드
미리 감사드립니다.
STL 스레드가 수행해야 할 작업을 마친 후에 스레드를 종료하고 싶습니다. 또한 스레드가 완료 될 때를 알 수있는 방법이 있습니까? 이벤트 정도.자동 종료 C++ 11 STL 스레드
미리 감사드립니다.
대신 스레드의 완료 상태를 폴링 할 수있는 방법을 원하는 경우 단순히 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";
}
작업은 join
라고 : 전화했을 때, 현재의 thread가 다른 스레드가 완료 될 때까지을 기다립니다 http://www.cplusplus.com/reference/thread/thread/join/
. 그처럼 간단합니다. 아무것도 더.
내가는 C#을하고 싶은 등이 될 havior, 제 말은'join '을 사용하면 스레드가 완료 될 때까지 실행이 멈추고 코드의 다른 부분이 그 시간에 계속 실행되기를 원합니다. –
메시지 대기열 + 메시지 처리기 또는 대기 상태에서 다른 작업을 실행하는 스레드가 두 가지 방법 만 사용할 수 있습니다. 문자 그대로 다른 방법이 없기 때문에 C#에서도 이렇게합니다. 믿지 않으면 C#의 "dispatcher"와 "default thread pool"에 대해 읽어보십시오. 여기서 가장 간단한 방법은 3 개의 스레드를 실행하는 것입니다. 하나는 "다른 작업"을위한 것이고, 다른 하나는 "어떤 시점에서 종료 할 스레드"를위한 것이고, 다른 하나는 "두 번째 스레드가 끝날 때까지 대기"를위한 것입니다. 그것은 '쓰레드 풀'방식입니다. – quetzalcoatl
또는 ** ** 모든 메시지 대기열이있는 경우 두 번째 스레드에서 대기열로 메시지가 끝나기 전에 메시지를 게시하도록 할 수 있습니다. 메시지 프로세서는 메시지를 확인하고 완료됩니다. 그것이 '파견인'방식입니다. – quetzalcoatl
스레드는 함수 f의 끝을 얻을의 후 종료 될 wiil :
void f()
{
do_some_work();
// end of function f
}
...
{
...
std::thread t(f);
do_some_other_work();
t.join();
}
기능 join
-> 블록의 현재 스레드를 스레드 t 멈출 때까지.
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를 사용하는 정말 좋은 아니에요 ...
이것은 정확히 내가 찾고있는 것입니다. 감사. –