2017-01-08 3 views
2

루프 내외부에 mutex lock() 및 unlock()을 사용하는 것과 다른 속도가 혼동 스럽습니다. 글로벌 변수 값과 함수를 1000000 번 증가시킵니다. 이 함수는 5 개의 스레드에 의해 병렬로 실행됩니다. I 경과 시간을 측정하고 이들 결과를 얻었다 : 제어가 너무뮤텍스 잠금 속도 차이가 내부 및 외부 루프보다 우수함

for(int i = 0; i < 1000000; i++) 
    {   
     mutex.lock(); 
     value++; 
     mutex.unlock(); 
    } 

2.10521 초 I은 제 2 내부 뮤텍스 배열로 가정

:

mutex.lock(); 
    for(int i = 0; i < 1000000; i++) 
    { 
     value++; 
    } 
    mutex.unlock(); 

0.160921 초가

및 벌금과 많은 시간이 스레드 전환 사이에 보낸 무엇입니까? 아니면 다른 것이 있습니까?

답변

3

뮤텍스 잠금 및 잠금 해제에는 다소 시간이 걸립니다. 특히 정수를 증가시키는 것보다 더 많은 시간이 걸립니다. 두 번째 예는 잠금/잠금 해제 속도를 테스트하는 것뿐만 아니라 뮤텍스가 잠금 해제 된 지점에서 다른 스레드가 인계 할 수 있기 때문에 작업 전환 오버 헤드를 추가합니다.

첫 번째로 컴파일러는 루프를 단일 추가로 대체 할 수 있습니다. 그리고 스레드의 기능 전체가 뮤텍스로 덮여 있기 때문에 병렬 실행이 없습니다. 하나를 제외하고 모든 스레드는 하나의 루프가 완료 될 때까지 방금 차단됩니다. 즉, 코드가 단일 스레드에서 연속으로 5 번 루프를 수행하는 것과 같습니다.

미세 조정 대용량 잠금과는 관계가 없습니다. 이러한 전략은 많은 리소스를 다루는 잠금이 거의 없는지 또는 몇 가지 리소스를 다루는 잠금이 많은지 여부에 관한 것입니다. 하나의 리소스 (전역 int)가 있으므로 결정을 내릴 수 없습니다.

대신에 잠시 동안 뮤텍스를 잠글 것인가에 대해 다른 스레드가 작업 할 시간을 남겨 두거나 오랜 기간 동안 잠그면 오버 헤드를 피할 수 있지만 병렬 처리는 줄어 듭니다. 그러나 스레드가 보호 된 리소스에 액세스하는 것 외에는 아무 것도하지 않기 때문에 "시간의 여유가 없습니다". 문제 (정수 5000000 번 증가)는 처음에는 고유 한 병렬 처리가 없으므로 다중 스레드가 악용되지 않습니다.