2016-03-19 4 views
4
mutex.lock(); 
try 
{ 
    foo(); // can throw exception 
} 
catch (...) 
{ 
    mutex.unlock(); 
    throw; 
} 
mutex.unlock(); 

ロックを解除するには、catchブロックと通常はmutex.unlock()を呼び出す必要があります。重複を避けるオプションはありますか?例外でミューテックスのロックを解除する

は何を探してるんですがstd::lock_guardのようなミューテックスラッパーであるあなたに

+10

はい、単に[std :: lock_guard](http://en.cppreference.com/w/cpp/thread/lock_guard)を使用してください。 – rwols

+0

ニース!ありがとうございました! – tambel

+0

歓迎します:-) – rwols

答えて

5

ありがとう:

#include <mutex> 
std::mutex _mutex; 

void call_foo() 
{ 
    std::lock_guard<std::mutex> lock(_mutex); 

    try 
    { 
     foo(); // can throw exception 
    } 
    catch (...) 
    { 
     throw; 
     // the mutex is unlocked here... 
    } 

    // ... and here 
} 

lockがスコープの外に出るときは、そのデストラクタは、基礎となるミューテックス_mutexのロックを解除します。

std::unique_lockも参照してください。このクラスは、さらに機能を提供し、さらにオーバーヘッドを追加する可能性があります。この場合、std::lock_guardで十分です。

関連する問題