더북(TheBook)

스레드의 메인 루프를 다시 봅시다.

// 각 스레드의 메인 함수
// 값을 가져올 수 있으면 루프를 돈다.
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 상태가 아닐 수 있다는 의미이기도 합니다. 그런데 소수를 계산하는 연산은 , 구간보다 훨씬 많은 양을 연산합니다. , 도 성능 불만족의 이유가 될 수 있지만, 그 비중이 크다고 할 수 없습니다. 사실 이유는 다른 데 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.