이것으로 소수를 구하는 프로그램은 시리얼 병목이 거의 없음을 알 수 있습니다. 하지만 우리는 암달의 저주를 보고 싶습니다. 소수 구하는 프로그램을 다음과 같이 수정해 봅시다. primes_mutex에 대해 잠금을 한 후 강제로 스레드를 잠깐 재우겠습니다. Sleep(1);을 추가합니다.
lock_guard<recursive_mutex> primes_lock(primes_mutex); Sleep(1); primes.push_back(n);
그리고 다시 Concurrency Visualizer로 측정해 봅시다. 뭔가 무시무시해 보이는 그래프가 나옵니다.
▲ 그림 1-41 많은 시간이 Lock 대기로 낭비되고 있는 상황 표시
➊에서 알 수 있듯이 연산을 하는 데 사용한 시간은 9%에 불과합니다. 나머지는 Synchronization 67%와 Sleep 24%입니다. 여기서 Synchronization이란 뮤텍스를 이미 다른 스레드로 잠근 상태인지라, 그 잠금이 끝날 때까지 기다리는 동안의 시간을 의미합니다. Sleep(1)을 추가하니 전체 시간의 67%가 시리얼 병목에 걸린 것입니다. 그리고 나머지 24%는 Sleep(1)로 발생한 것입니다.