<aside> 💡
std::barrier
에서 "Invariant counter >= 0, possibly caused by preconditions violation” 라는 오류 메세지가 발생<aside> 💡
동기화 객체인 std::barrier
를 메인스레드의 RenderMultiThreaded()
함수에서 지역변수로 사용하던 것이 문제였다.
우선 멀티스레드 렌더링개념은
std::barrier
는 정해진 쓰레드 개수가 barrier
지점에 도달하였을 때 기다리던 쓰레드들이 모두 깨어난다.
그러나 문제는 CPU 스케쥴링은 OS가 결정한다는 점이다.
즉, 모든 스레드가 한 번에 동시에 일괄적으로 깨어나지는 않는다.
만약 빠르게 Context Switching 이 일어나지 않아서, 메인스레드가 다른 스레드들이 깨어나기도 전에 Render함수 Scope를 벗어나게 된다면,
메인스레드 RenderMultithreaded 함수의 지역변수인 std::barrier
는 유효하지 않게 된다..
설령 모든 스레드가 병렬적(Parallel) 으로 돌아간다하더라도 마찬가지로 메인스레드가 다른 스레드가 깨어나기전에 먼저 Render함수 Scope를 벗어나면 문제가 생길 것이다.
즉, 다른 스레드들은 유효하지 않은 변수를 참고하여 문제가 발생하게 된다. </aside>
<aside> 💡
std::barrier
를 절대로 함수 로컬변수로 두면 안된다
</aside>std::barrier
에서 문제가 생겨났다.