2014-10-16 2 views
2

상황 : 두 가지 방법이 있습니다. 방법 1은 config 값을로드합니다. 방법 2은로드 된 구성의 값을 반환합니다. 두 가지 방법 모두 다른 스레드에서 호출 할 수 있습니다.다른 뮤텍스를 같은 방법으로 사용할 수 있습니까?

이 문제를 : 나는/잠금 뮤텍스를 사용하려면는 두 가지 방법으로 잠금을 해제합니다. 그래서 방법 항목은 방법 2는 또한를 고정해야한다라고를 잠겨있을 때. 뮤텍스에 대해 읽었을 때 혼란스러워졌습니다. 잠금 해제가 호출 될 때까지 코드 영역을 잠그고 있다고합니다.

질문 : 나는 method1을 잠글 때 method2도 잠근 것입니까?

기대 : method2가 method2에서 반환 할 구성 데이터를 업데이트 할 때 호출 될 method2입니다.

샘플 코드 :이 뮤텍스가 사용되는 방법을 정확하게

void Class::method1() { 
    pthread_mutex_lock(mutex1); 
    string1 = "a value"; 
    pthread_mutex_unlock(mutex1); 
}; 

void Class::method2(string& aString) { 
    pthread_mutex_lock(mutex1); 
    aString = string1; 
    pthread_mutex_unlock(mutex1); 
    return; 
}; 
+0

* 다른 *을 호출하는 두 가지 방법 중 하나를 사용하지 않으려 고합니다. 맞습니까? 그렇지 않다면 하나의 뮤텍스가 적당 해 보일 것입니다. – WhozCraig

+0

로더는 입력 파일을 매개 변수로 사용하도록 설계 되었습니까? 그렇지 않으면 getter 주위에 게으른 초기화 프로그램이 더 나은 선택 일 수 있습니다. 복잡성을 줄이려면 메소드 2를 통해 얻는 것이 좋습니다. – nerdwaller

+0

method1이 config를 업데이트 할 때 호출되는 method2 method2에 의해 리턴 될 데이터. –

답변

1

- 다른 스레드가 동시에 하나 개의 스레드에서 액세스되는 데이터를 보호하기 위해, 또는 수정 될 수 있습니다. method2의 버그를 수정하십시오 (RAII를 사용하여 뮤텍스를 획득하고 리턴 값을 복사 한 후에 뮤텍스 홀더의 소멸자가 뮤텍스를 잠금 해제하는 것이 바람직 함).

1

예, 동일한 뮤텍스를 사용할 수 있습니다. 이 RAII로를 확보하는 것이 더 바람직 비록 (뮤텍스가 std::mutex 또는 lock()을 구현 pthread_mutex_t 래퍼와 unlock() 있다면 당신은 std::lock_guard을 사용할 수 있습니다) :

void Class::method1() { 
    std::lock_guard<std::mutex> lock(mutex1); 
    ... 
} 

뿐만 아니라 당신이 코드에서 어디 return 문을 배치 할 수 있습니다이 방법 , 또한 예외 안전성을 얻습니다 (mutex는 메소드가 예외를 throw하면 잠금 해제됩니다).

관련 문제