2016-11-13 9 views
2

std::condition_variablestd::unique_lock을 같이 사용하고 있습니다.std :: condition_variable을 std :: lock_guard와 함께 사용할 수 있습니까?

std::mutex a_mutex; 
std::condition_variable a_condition_variable; 
std::unique_lock<std::mutex> a_lock(a_mutex); 
a_condition_variable.wait(a_lock, [this] {return something;}); 
//Do something 
a_lock.unlock(); 

잘 작동합니다. 내가 알고 있듯이 std::condition_variable은 대기 할 수있는 std::unique_lock을 허용합니다. 그러나, 나는 그것을 std::lock_guard와 결합하려고 노력하고 있지만 할 수는 없습니다.

내 질문은 :는 대신 std::lock_guardstd::unique_lock을 대체 할 수 있습니까? 이렇게하면 잠금을 해제 할 때마다 수동으로 잠금을 해제 할 수 있습니다.

답변

2

아니요, std::condition_variable과 함께 사용하는 경우 std::unique_lock이 필요합니다. std::lock_guard은 오버 헤드가 적지 만 std::condition_variable과 함께 사용할 수 없습니다.

그러나 std::unique_lock은 수동으로 잠금을 해제 할 필요가 없으며 std::lock_guard과 같이 범위를 벗어날 때 잠금 해제됩니다.

std::mutex a_mutex; 
std::condition_variable a_condition_variable; 
{ 
    std::unique_lock<std::mutex> a_lock(a_mutex); 
    a_condition_variable.wait(a_lock, [this] {return something;}); 
    //Do something 
} 

http://en.cppreference.com/w/cpp/thread/unique_lock

2

불가능하지만 실제로는 필요하지 않습니다.

std::unique_lock 자동으로 unlocks itself in destructor (잠긴 경우).

+0

감사합니다. 두 대답 모두 수용 가능합니다. 방금 두 가지 중 하나를 선택했습니다 –

3

는 조건 변수에 wait()에 대한 모든 호출이 항상 mutex을 기본 lock()unlock() 필요합니다 참조 : 그래서 대기 코드로 작성할 수 있습니다. 래퍼 lock_guard<>은 이러한 기능을 제공하지 않으므로 결코wait()을 함께 사용할 수 없습니다.

여전히 lock_guard<>을 기반으로하는 간단한 뮤텍스 랩퍼를 작성하고 필요한 두 가지 방법을 추가 할 수 있습니다. 또한 당신이 잠금 어떤 잠금/뮤텍스를 받아 condition_variable_any를 사용하는 것() /() 인터페이스의 잠금을 해제 : 다음

#include <mutex> 

template<typename _mutex_t> 
class my_lock_guard 
{ 
public: 
    explicit my_lock_guard(_mutex_t & __m) : __mutex(__m) 
    { __mutex.lock(); } 

    my_lock_guard(_mutex_t & __m, std::adopt_lock_t) : __mutex(__m) 
    { } // calling thread owns mutex 

    ~my_lock_guard() 
    { __mutex.unlock(); } 

    void lock() 
    { __mutex.lock(); } 

    void unlock() 
    { __mutex.unlock(); } 

    my_lock_guard(const my_lock_guard &) = delete; 
    my_lock_guard& operator=(const my_lock_guard &) = delete; 

private: 
    _mutex_t & __mutex; 
}; 

를 실행 한 다음, 같은 빠른 해명

#include <condition_variable> 
... 
std::mutex m; 
my_lock_guard<std::mutex> lg(m); 
std::condition_variable_any cva; 
cva.wait(lg, [] { return something;}); 
// do something ... 
... 
+1

'lock_guard'가'condition_variable_any'에 대해 작동하지 않습니다. 에러 메시지는 멤버 함수'lock()'과'unlock()'이 빠져 있다는 것을 말해줍니다. 왜 그런가요? –

+0

몇 가지 세부 정보 (컴파일러, 오류 메시지, 코드)를 추가 할 수 있습니까? 어쩌면 새로운 질문을 만드는 것이 더 깔끔할 수도 있습니다. –

+1

첫 번째 코드를 잘라내어 include,'main'을 추가하고 람다를 수정하여'true'를 반환했습니다. macOS에서 제공하는 최신 clang을 사용하고 있습니다. 오류 메시지는 다음과 같습니다. http://codepad.org/8Xvh8O1m 코드가 컴파일됩니까? 어떤 컴파일러로? –

관련 문제