2016-09-08 1 views
2

lock_guard하려면 어떤 시점에서 뮤텍스를 사용하고 블록을 떠날 때 잠금을 해제하십시오. 이를 위해이 std::lock_guardstd::unique_lock 제공 :thread_guard 등가는 표준 라이브러리를 수동으로 잠그고 잠금을 해제 할 수있는 기능과 더불어, <a href="http://en.cppreference.com/w/cpp/thread/mutex" rel="nofollow noreferrer"><code>mutex</code></a> 클래스를 제공/unique_lock

std::mutex m; 
std::lock_guard<std::mutex> lock(m); 
// ... 

// Automatic unlock 

내가 스레드에 대한 매우 일반적인 패턴은 하나를 만들 생각 (중 스택 변수 또는 구성원으로) 다음 join it before destructing it :

std::thread t(foo); 
// ... 
t.join(); 

걸릴 것이다하는 thread_guard 쓰기 쉬운 것 같습니다 thread (또는 thread s의 순서), 그냥 자신의 파괴에 join를 부를 것이다 :

std::thread t(foo); 
thread_guard<std::thread> g(t); 
// ... 
// Join automatically 
  1. 표준 라이브러리 클래스가 있습니까?

  2. 그렇지 않은 경우,이를 피할 수있는 이유가 있습니까?

+0

항상 스레드를 분리 할 수 ​​있으며 스레드가 종료되면 자동으로 "결합"됩니다 (실제로 결합되지는 않지만 자원은 동일하게 정리됩니다). –

+0

@ JoachimPileborg 감사합니다. 분리는 뭔가 다르지만, 그렇지 않습니까? 블록을 떠나기 전에 (직접적으로, 간접적으로)'join '하면 블록이 종료되면 쓰레드가 끝났음을 알 수 있습니다. –

+0

최근에 'joining_thread'가 제안되었지만 [shot down] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0379r0.html). –

답변

4

이 문제는 잊지 경우 오류를 찾기 어려운 원인이 스콧 마이어의 책 "현대 효과적인 C++"

문제는 또 다른 기본 동작이 될 경우 (분리 또는 결합)이다에서 설명 암시 적 조작이 있음을 나타냅니다. 따라서 파기시의 실제 기본 동작은 명시 적으로 조인되거나 분리되지 않으면 어설 션됩니다. 그리고 그 이유 때문에 "보호"수업도 없습니다.

항상에 가입하고 싶다면 같은 수업을 직접 작성하는 것이 안전합니다. 그러나 누군가 그것을 사용하고 분리하려고 할 때, 소멸자가 암묵적으로 그것을 결합한다는 것을 잊을 수 있습니다. 따라서 그러한 기능을 개발할 때 위험이 따릅니다.

다른 방법으로 부스트 또는 어리 석음 라이브러리 (개인적으로 더 선호하는)로 scope_guard을 사용할 수 있으며 처음에 명시 적으로 의도를 선언하면 실행됩니다. 또는 정책 기반 "Guard"클래스를 작성할 수 있습니다.이 클래스에서는 파손시 수행 할 작업을 명시 적으로 명시해야합니다.

+1

감사. Scott Meyers를 너무 많이 읽을 수 없습니다! –