2012-05-11 3 views
1

을 병합하여 건설되었다 수 : https://stackoverflow.com/a/5524120/462608뮤텍스 잠금 - 세트는 여기에서

당신이 그런 개체 집합에서 여러 뮤텍스로 보호 된 객체를 잠글 경우, 세트 수 있었다 을 병합에 의해 만들어, 당신은

병렬 작업에 더 많은 스레드를 허용, 객체 정확히 하나의 뮤텍스에 따라 선택하여 사용할 수 있습니다

또는 1 참조 사항에 오브젝트 당 사용 Y는 아마도 모두 함께 뮤텍스 잠글 실패의

을 확률을 낮추거나 여러번 잠금 의도를 우회 모든 가능한 공유 비 재귀 뮤텍스 반대 한 비교 기준에 따라 사용하는 재귀 뮤텍스를 공유.

위의 전체 인용문을 이해할 수 없습니다. 그는 무엇을 말하는 겁니까? 평신도의 말로 설명해주십시오.

+1

나는이 제목이 애처 롭다는 것을 알고 있지만 더 나은 "특정"제목을 결정할 수는 없다. –

답변

0

인용 된 인용문에 대한 나의 해석입니다. 나는 그것이 원래의 대답을 쓰는 사람의 의도와 실제로 일치하고 이해할 수 있기를 바랍니다.

뮤텍스로 보호해야하는 데이터 구조가 있다고 가정 해 보겠습니다. '세분화 된'방법으로 이러한 객체를 다루는 중요 섹션을 처리 할 수있는 몇 가지 옵션이 있습니다.

  • 사용 객체 당 하나의 뮤텍스 :

    struct foo { 
        mutex mux; 
    
        // important data fields... 
    }; 
    

    이것은이 이러한 옵션은 스레드가 동시에 여러 객체에 대한 잠금을 얻기 위해 행동해야하는 방법에 영향을 미칠 수 다른 객체를 다루는 스레드는 아무런 논쟁 거리가 없다는 이점이 있습니다. 단일 스레드가 여러 객체를 처리해야 할 경우 (이 객체가 '병합 설정'의 의미라고 생각합니다) 재귀 적 뮤텍스가 필요 없습니다. 그러나 교착 상태를 피하려면주의를 기울여야합니다.

  • 각 개체는 다른 개체들과 공유 될 수있는 재귀 뮤텍스 참조있다 : 스레드 1 시도가 객체 A 및 스레드를 잠그는 경우 두 개체가 실제로 단일 뮤텍스와 연관 될 수 있기 때문에

    struct foo { 
        recursive_mutex* pmux; 
    
        // important data fields... 
    }; 
    

    2는 객체 A와 B가 같은 뮤텍스를 공유 할 때 동시에 객체 B를 잠그려고하면 다른 스레드가 뮤텍스를 해제 할 때까지 스레드 중 하나가 차단됩니다. 뮤텍스는 재귀 적이기 때문에 단일 스레드는 동일한 뮤텍스를 공유하더라도 여러 객체를 잠글 수 있습니다. 교착 상태에 대해서는 여전히 동일한주의 사항이 있습니다.

    우선이 스키마의 장점은 스레드가 여러 개체를 동시에 잠그는 경우 해당 집합에있는 개체 중 일부가 뮤텍스를 공유 할 확률이 높다는 것입니다. 스레드가 객체 중 하나를 잠그면 이론 상으로는 다음 객체를 잠글 때 블로킹 가능성이 줄어 듭니다. 그러나 실제로는 스레드와 스레드의 잠금 동작을 특성화 할 수 없다면 이러한 이점을 누릴 수 있음을 증명하는 것이 다소 어려울 수도 있습니다 (그리고 뮤텍스 공유를 미러링하도록 설정하십시오. 모델).

  • 위 인용문의 마지막 항목은 위의 시나리오에서 비회원 잠금을 사용하는 것을 의미합니다. 이 경우 스레드가 뮤텍스를 재 록킹하지 못하도록해야합니다 (물론 재귀 적 뮤텍스로는 수행 할 수 없습니다). 그래서 스레드는 어떻게하면 잠금을 비교할 것인가? 객체에 대한 잠금을 획득해야하는지 그렇지 않아야 하는지를 결정하기 위해 이미 획득 한 잠금을 획득합니다. 몇 개 이상의 객체가 관련되어있는 경우 스레드가 올바른 잠금 세트를 정확하게 획득했는지 확인하기 위해 복잡한 시나리오가 될 수 있습니다. 대신 수동으로 뮤텍스 인라인을 획득

    struct foo { 
        mutex* pmux; // pointer to (possibly shared) non-recursive mutex 
    
        // important data fields... 
    }; 
    
    // a set of objects a thread needs to work on in a critical section 
    // the objects possibly share non-recursive mutexes 
    struct foo* pA; 
    struct foo* pB; 
    struct foo* pC; 
    
    // acquire the necessary locks on all three objects: 
    mutex_lock(pA->pmux); 
    if (pB->pmux != pA->pmux) mutex_lock(pB->pmux); 
    if ((pC->pmux != pA->pmux) && (pC->pmux != pB->p-mux)) mutex_lock(pC->pmux); 
    
    // releasing the set of mutexes is similar 
    

    , 아마 중복 된 무시 된 것을 확인의 복잡성을 관리하는 기능을 전달하는 데 더 좋을 것이다. 이전 방식과 마찬가지로 교착 상태를 피하려면 여전히 해결해야합니다.

관련 문제