글
앞선 글의 <예제.1>을 보면 제일 아래에
#include <thread>
#include <iostream>
int main()
{
std::thread Thread1( [] ()
......
getchar();
return 0;
}
마지막 줄에서 두 번째에 getchar();를 사용했습니다. 만약 이것을 제거하고 예제 코드를 실행하면 다음과 같은 에러가 발생합니다.
이 에러가 발생하는 이유는 아직 스레드는 실행 중인데 프로그램이 종료 되었기 때문입니다. getchar();를 사용하여 유저의 입력을 받을 때까지 대기하도록 하여 문제를 해결할 수 있지만 이것은 임시
방편입니다. 올바른 방법은 thread 클래스의 join 함수를 사용하여 스레드의 실행이 끝날 때까지 대기하도록 합니다. <예제.1>에 join을 사용하도록 수정하면 아래와 같습니다. < 예제. 2 > #include <thread> #include <iostream> int main() { std::thread
Thread1( [] () { for( int i = 0; i < 5; ++i ) { std::cout
<< "Thread Num : " << i << std::endl; } }
); std::thread
Thread2; Threads
= std::thread( [] () { for( int i = 10; i < 15; ++i ) { std::cout << "Thread Num :
" << i << std::endl; } }
); std::thread
Thread3 = std::thread( [] ( int nParam ) {
for( int i = 20; i < 25; ++i ) { std::cout << "Thread Parameter :
" << nParam << std::endl; } }, 4 ); Thread1.join(); Thread2.join(); Thread3.join(); return 0; } <예제.2>는
제일 아래에서 각 thread 객체의 join을 호출하고
있어서 Thread1, Thread2, Thread3는 생성과 동시에 실행이 되는데 만약 Thread1의 실행이 끝난 후 Thread2가 실행되고 이것이 끝나면 Thread3를 실행하려면 thread 객체를 생성 후 join을 호출하면 됩니다. < 예제. 3 > #include <thread> #include <iostream> int main() { std::thread Thread1(
[] () { for( int i = 0; i < 5; ++i ) { std::cout
<< "Thread Num : " << i << std::endl; } }
); Thread1.join(); std::thread
Thread2; Threads
= std::thread( [] () { for( int i = 10; i < 15; ++i ) { std::cout << "Thread Num :
" << i << std::endl; } }
); Thread2.join(); std::thread
Thread3 = std::thread( [] ( int nParam ) {
for( int i = 20; i < 25; ++i ) { std::cout << "Thread Parameter :
" << nParam << std::endl; } }, 4 ); Thread3.join(); return 0; }
댓글