스레드 간의 데이터 공유 - 연구는 "C ++ 동시 프로그래밍 전투"(3) 노트

경쟁 조건 : 
    프로세스가 각 스레드가 데이터를 공유 할 수 있습니다 때, 장점 및 비정상 운영 데이터로 이어지는 단점, 모두가 다른 스레드를 표시, 경쟁 조건은 그들 중 하나입니다. 

경쟁 조건을 피하십시오 : 
    1 : 보호 메커니즘, 패키지의 데이터 구조가 변경되거나 다른 스레드 전이나 수정 후 수정 공유 데이터에 표시 액세스 할 수 있도록 액세스하고 있습니다. 
    II는 : 이러한 프로그램 잠금 프리 (NO 로크 데이터 구조, 등)로 사용하거나 불변 데이터 구조 설계를 수정하는 단계를 포함한다. 
    
뮤텍스 보호 : 
    동기화 기본으로 뮤텍스는 스레드가 자원 잠금을 해제 공유 데이터 리소스 및 후 처리를 고정됩니다 때, 다른 스레드가 자원이 볼에 액세스 할 수 있도록합니다. 
    그러나 보장하기 위해주의해서 취급 뮤텍스가 필요없는 교착 상태가 너무 많이, 너무 적은 데이터의 보호. 
    표준 : 템플릿 클래스를 사용하여 표준 :: 명시 적으로 호출 잠금 방지하기 위해 RAII 뮤텍스의 사용을 구현 lock_guard 이외에 기본 패키지의 뮤텍스 잠금 동작 / UNLOCK 인터페이스를. 
    또한 뮤텍스 일반적으로 공유 데이터는 클래스로, 함께 보호하고 보호 된 데이터의 누출 (예를 들면 않도록주의 디자인이 필요합니다 : 던져 또는 주소 참조 또는 전달 
    다른 공유 액세스 보호에를 외부 함수 등) 데이터. 스레드가 획득하면 스레드가 이미 표준 : : 뮤텍스 잠금, 예외를 보유하면 잠금이 다시 나타납니다, 당신은 사용해야 
    재귀 잠금 표준 : recursive_mutex합니다. 

: 교착  
    일반적으로 두 개 이상의 스레드에서 서로의 잠금 자원 Shique가 서로 소유 한 다른 자원을 해제 잠금 대기있다. 그리고 교착 상태를 생성합니다. 이러한 상황은 종종 두 가지를 고정 할 필요가 발생
    상황이나 뮤텍스 또는 동작이 자주 발생하는 수행하는 다른 원시적 시간. 다른 시나리오는 서로 다른 자원이나 동기화 할 필요에서 다른 스레드를 기다리는 포함한다. 
    
일반 연습 교착 상태를 피하십시오 :
    항상 같은 순서로 두 개 이상의 뮤텍스 잠금이나 다른 원시를 사용합니다. 그럼에도 불구하고, 이것은 또한 교착 상태 (예를 들어, 객체의 동일한 인스턴스가 스위칭 동작을 수행하기 위해)을 초래할 수있다. 
    표준 : 잠금 경우 동시에 잠금 기능과 잠금을 해제하기 위해 둘 이상의 바인딩 템플릿 클래스 표준 : lock_guard을 잠글 수있는 템플릿에 의해서는 (표준 : adopt_lock 식별 점유 잠근 
    배치 방식의 경우). 표준 : 잠금 기능 템플릿 방식과 유사한 문제에 달성 중 하나를 동시에 취득 잠금 장치를하거나 실패 할 수 있습니다. 

다른 방법은 교착 상태를 피하기 위해 : 
    1 중첩 잠금 피한다 잠금 복수 취득 부가 필요한 경우, 즉, 기껏해야 상기 방지 다른 로크를 획득하기 위해 로크를 보유하는 단일 스레드, 템플릿 기능 표준 : 잠금 장치와 함께 사용되어야한다. 다수의 잠금을 획득.
    2 . 잠금을 보유 않도록하고 사용자가 제공 한 코드 호출 취득 여러 잠금 교착 나타날 때 발생할 수 로크를 획득하는 동작을 초래할 수있다 고객이 제공 한 코드.
    3 . 정해진 순서에 잠금을 획득 : 잠금 복수의 템플릿 표준 : 잠금 기능을 사용하지 않고 얻는 것이 요구에 대한 각 스레드는 동일한 순서로 로크를 획득한다.
    4 계층 방식으로 사용 잠금 각 뮤텍스 또는 다른 원시적 분배 레이어 번호 및 기록 무엇을 각 스레드 잠금 뮤텍스. 코드가 더 낮은 레벨에있는 경우, 뮤텍스 잠금하려고하면 
       로크 유지되고, 그것이 뮤텍스를 취득 할 수 없다 (즉, 뮤텍스보다 레이어 번호는 레이어 번호 뮤텍스를 잠근 허용 높거나, 또는 획득 뮤텍스 낮은 레벨의 수). 
    . 5 잠금을 작동하는 인터페이스와 같이 설정된 tryLock 단계;. 표준 :: unique_lock 템플릿 잠금, 잠금 템플릿 표준은 :: 상대적으로 더 유연한 lock_guard 잠금 객체를 소유 할 필요가 없습니다 및 잠금 / 잠금 해제가 / . 재귀 로크 표준 : recursive_mutex 다중의 획득을 동일한 로크를 달성 할 수 있지만, 획득 및 쌍으로 공개된다. 표준 :: unique_lock이 결합 될 수있다 또는 표준을 획득 방지시키는 :: lock_guard을
       그러나 그것은 또한 표준 : 이동 의미입니다 소유권의 이전을 지원하는 템플릿 잠금뿐만 아니라 작은 공간과 효율성의 일부 손실을 차지합니다. 
    
단위 잠금 : 
    공유 데이터의 보호 요구에 대응 입자 크기를 피하기 위해 잠이 너무 크거나 너무 작습니다. 멀티 스레드 성능으로 이어질 수 있음이 너무 큽니다. 
    또한에만 잠금 단위는 잠금을 보유하고있는 시간에 대해 우려 할 필요가 없습니다 잠금, 장기 보류에게 잠금을 피할 수 있습니다. 
    
다른 보호 메커니즘 또는 도구가 공유 데이터 : 
    1 . 초기화에서 공유 데이터를 보호하기 위해 : 처음으로 초기화를 보호. (읽거나 개체 또는 포인터를 쓸 때 차 검사는 몇 가지 문제, 즉 데이터 인종, 다른 스레드를 잠글 
       표준 : once_flag 및 표준 : call_once 이러한 문제를 해결, 동기화되지 않음). 사실, 초기 C에서 지역 정적 객체의 반환 ++ 문제는 경쟁하기 전에 (11)가있을 것입니다 수 있습니다, 
       하지만 C ++는 11 지역 정적 객체 후 반환하면 안전 및 표준 : call_once을 대체 할 수 있습니다.
    2 . 그러한 즉 읽기 쓰기 잠금 단일 배타적 기입 락 공유 판독 로크 복수 같은 보호 드물게 업데이트되지 데이터 구조. 판독 동작을 감소시키고, 데이터 구조는 종종 로크에 의해 보호된다.
    3
       잠금 상황의 출시와 함께 일관성. 재귀 잠금 장치는 일반적으로 권장되지 않습니다, 당신은 재 설계 또는 재귀 잠금을 방지하기 위해 부분적인 구현을 달성 리모델링을 고려해야합니다.

 

추천

출처www.cnblogs.com/haomiao/p/11647391.html