2016-06-06 1 views
1

테스트를 완료했지만 스레드 실행 순서를 파악하지 않았습니다.
C++ multithreading : 실행 순서

여기

내 코드입니다 : --- "N \ N func1func2의 \"표시됩니다
대기 4 초 동안 ---> :이 경우

void func1() 
{ 
    std::this_thread::sleep_for(std::chrono::milliseconds(4000)); 
    std::cout<<"func1"<<std::endl; 
} 

void func2() 
{ 
    std::this_thread::sleep_for(std::chrono::milliseconds(4000)); 
    std::cout<<"func2"<<std::endl; 
} 
int main() 
{ 
    std::thread t(func1); 
    std::thread t2(func2); 

    t.join(); 
    t2.join(); 
    std::this_thread::sleep_for(std::chrono::milliseconds(8000)); 

    cout << "Hello World" << endl; 

    return 0; 
} 

, 나는 아래의 결과를 얻었다 >기다림 8 초 ---> "Hello world"가 표시됩니다.

나는 아래 main의 코드의 순서를 변경하는 경우 :

t.join(); 
std::this_thread::sleep_for(std::chrono::milliseconds(8000)); 
t2.join(); 

난 그냥 위와 같은 결과를 얻을 수 있습니다.

단, I는 다음과 같이 변경하는 경우 :

std::this_thread::sleep_for(std::chrono::milliseconds(8000)); 
t.join(); 
t2.join(); 

결과가된다 :
대기 4 초간 ---> "func1func2의 \ n \ n"도시 ---> 대기 sec ---> "Hello world"가 표시됩니다.
이 경우 메인 스레드와 t 및 t2가 동시에 4 초 동안 대기하는 것으로 보입니다.

이 모든 것을 설명하는 방법은 무엇입니까?

+1

병렬로 실행하면 스레드가 정확히 실행됩니다. 'join '을 호출하는 경우에만 하나의 스레드가 다른 스레드의 완료 상태를 기다립니다. 그래서 마지막 경우에, 쓰레드는 4 초 동안 대기하고, 끝내고, 메인 쓰레드는 8 초 동안 대기하고, 두 개의 쓰레드가 모두 끝나기 때문에'join'은 기다릴 필요가없고, "Hello World"를 출력합니다. –

답변

0

잠금 장치 (보통 세마포어)를 사용하지 않고 스레드의 실행 순서를 예측할 수 없습니다. 프로세스 스케줄러 만이이를 결정할 것입니다 (매우 낮은 레벨, 프로세서가 컨텍스트간에 전환하는 데 도움이됩니다).

첫 번째 경우 두 스레드가 시작되고 4 초 후 "funcX"(해당 기능에 해당)가 인쇄됩니다. 주 스레드는 스레드를 조인 (join 메서드의 목적)을 기다린 다음 "hello world"를 인쇄하기 전에 8 초 동안 기다립니다. join 메서드는 스레드가 완료 될 때까지 주 스레드의 실행을 차단합니다.

두 번째 경우에는 스레드가 8 초 대기 후 결합합니다. 실제로 주 스레드와 다른 두 스레드는 동시에 대기합니다. 그래서 4 초 후 메시지를 출력하고 4 초 후에 (메인 대기 시간은 4 초) "hello world"가 나타납니다!

여기에 무슨 일이 일어나고 있는지 이해하는 데 도움이되기를 바랍니다.

+0

사실 3 건이 있습니다. 두 번째 설명해 주시겠습니까? 't.join main.waitfor (8sec) t2.join'? 나는 당신의 "두 번째 사건"이 나의 "세 번째 사건"이라고 생각합니다. – Yves

+0

귀하의 의견에 주어진 경우는 다음과 같이 실행됩니다 : – Polux66

+0

(내 kb, mis의 사용 미비) 당신이 이해하기 어려운 것 같습니다 조인() 방법의 사용입니다 :이 방법은 메인 스레드를 기다리는 알려줍니다 끝내기 위해. 그러나 스레드는 그 전에 끝날 수 있습니다. – Polux66