쓰레드가 3개 만들어져서 실행되었지만, 공유 객체를 동기화하지 않아서 발생한 문제다. 이문제는 동기화를 통해 해결한다.
C++ 표준에 따르면, join 되거나 detach 되지 않는 쓰레드들의 소멸자가 호출된다면 예외를 발생시키도록 명시되어 있습니다. 따라서, 우리의 쓰레드 객체들이 join 이나 detach 모두 되지 않았으므로 위와 같은 문제가 발생하게 됩니다.
아, 그렇다면 detach 가 무엇일까요? detach 는 말 그대로, 해당 쓰레드를 실행 시킨 후, 잊어버리는 것 이라 생각하시면 됩니다. 대신 쓰레드는 알아서 백그라운드에서 돌아가게 됩니다. 아래 예제를 통해 살펴보겠습니다.
thread::join()가 호출되면 실행 스레드가 완료 될 때까지 호출 스레드가 차단됩니다. 기본적으로 이것은 스레드가 언제 완료되었는지 알 수있는 메커니즘입니다. thread::join()가 반환되면 OS 실행 스레드가 완료되고 C++ thread 개체가 손상 될 수 있습니다.
thread::detach()가 호출되고 실행 스레드가 thread 객체에서 "분리되어"더 이상 thread 객체로 표시되지 않습니다. 두 개의 독립된 것입니다. C++ thread 객체는 손상 될 수 있으며 OS 스레드 실행은 계속 될 수 있습니다. 프로그램이 해당 실행 스레드가 완료된시기를 알아야하는 경우 다른 메커니즘을 사용해야합니다. join() 개체는 더 이상 실행 스레드와 연결되지 않으므로 thread 개체에서 더 이상 호출 할 수 없습니다.
gamdekong.tistory.com/98modoocode.com/269
씹어먹는 C ++ - <15 - 1. 동시에 실행을 시킨다고? - C++ 쓰레드(thread)>
modoocode.com