스레드의 메인 루프를 다시 봅시다.
// 각 스레드의 메인 함수 // 값을 가져올 수 있으면 루프를 돈다. while (true) { int n; { // ➊ lock_guard<recursive_mutex> num_lock(num_mutex); n = num; num++; } if (n >= MaxCount) break; if (IsPrimeNumber(n)) { // ➋ lock_guard<recursive_mutex> primes_lock(primes_mutex); primes.push_back(n); } }
➊, ➋ 구간에서 락(lock)을 하고 있어 다른 스레드가 대기 상태로 전환하는 상황이 발생합니다. 이는 100% 완전히 모든 스레드가 Runnable 상태가 아닐 수 있다는 의미이기도 합니다. 그런데 소수를 계산하는 연산은 ➊, ➋ 구간보다 훨씬 많은 양을 연산합니다. ➊, ➋도 성능 불만족의 이유가 될 수 있지만, 그 비중이 크다고 할 수 없습니다. 사실 이유는 다른 데 있습니다.