2012-10-12 3 views
13

저는 std :: thread를 처음 사용합니다. 스레드를 다른 스레드에서 잠자기 상태로 만들 필요가 있습니까?std :: thread sleep하는 방법

std::this_thread::sleep_for(std::chrono::seconds(1)); 

하지만 내가 원하는 것은 같은 : 예에서, 내가 보는 모든 코드처럼

std::thread t([]{...}); 
t.sleep(std::chrono::seconds(1)); 

또는 sleep(t, std::chrono::seconds(1));

어떤 아이디어?

+4

정직하게 말하면, 가장 좋은 해결책은 어떤 문제가 현명한 방법으로 해결되는 것입니다. 다른 스레드에서 스레드를 잠자기 상태로 설정해야하는 이유는 없습니다. 스레드가 지금하고 싶은 작업을하고 있다면 왜 잠자기 모드로 전환해야합니까? 쓰레드가 지금하고 싶은 작업을하지 않으면 코드가 깨져서 고쳐야합니다. –

+2

아마도 'std :: condition_variable'과'wait (...)'또는'wait_for (...)'와 같은 메소드를 사용하고 싶을 것입니다. – hirschhornsalz

답변

19

sleep_for은 동기식이기 때문에 현재 스레드에서만 의미가 있습니다. 원하는 것은 다른 스레드를 일시 중단/다시 시작하는 방법입니다. 표준은 이것을 수행하는 방법을 제공하지 않지만 (afaik), native_handle을 사용하는 플랫폼 종속적 인 방법을 사용할 수 있습니다.

예를 들어 Windows의 경우 SuspendThreadResumeThread입니다.

그러나 더 중요한 것은 거의 필요가 없다는 것입니다. 일반적으로 표준에서 제공하지 않는 기본적인 것들을 만날 때 위험한 설계 경로로 향하는 것은 적기입니다. 더 큰 목표를 다른 방식으로 달성하는 것을 고려하십시오.

+0

"붉은 깃발"은 유효하고 아주 좋은 조언입니다! 절대적이지는 않지만 신중하게 생각하십시오. 프로그래머가 약점, 단점, 실수, 유용한 확장 및 실패를 지속적으로 발견 한 결과 언어가 끊임없이 변하고 있습니다. – CarlH

9

아니요. 표준은 당신에게 그런 시설을 제공하지 않으며해서는 안됩니다. 잠은 무엇을합니까? 주어진 시간 동안 주어진 스레드의 실행을 일시 중지합니다. 다른 thread가, 동기를 확립하지 않고, 주어진 thread를보다 나은 퍼포먼스를 실현하기 위해서 sleeve 할 수 있을지 어떨지를 알 수 있습니까?

아니요. 스레드에서 얻는 성능 향상을 막을 수있는 동기화 된 인터페이스를 제공해야합니다. 필요한 정보가있는 유일한 스레드는 스레드 자체입니다. 따라서 std::thread에는 sleep이라는 구성원이없고 std::this_thread에는 1이 있습니다.

관련 문제