2012-02-29 3 views
12

boost::mutex::scoped_lockでロックされた変数は、範囲外になると自動的にロック解除されることを理解しています。ブーストスレッドのboost :: unique_lockはスコープロックですか?

どのようにboost::unique_lockについては、範囲外のときに自動的に変数のロックを解除しますか?

誰もその機能の参照を指すことができます。

double x; 
boost::mutex x_mutex; 

void foo() 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(x_mutex); 
     x = rand(); 
    }  
    ...... some calculation which takes 10 second ...... 
    ...... is x still locked here??? ......  
} 

ありがとうございます。

+1

はい、そうです。ドキュメントは次のとおりです。http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.locks.unique_lock –

+1

デストラクタがロックを解除しなかった場合、それは今までにロックが解除される? –

+0

その反対のラウンド。 'boost :: mutex :: scoped_lock'は' unique_lock'のtypedefです。 http://www.boost.org/doc/libs/1_57_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.mutex – balki

答えて

12

scoped_lockは、unique_lockです。 mutex.hppで:ロックが取得された場合は

typedef unique_lock<mutex> scoped_lock; 

デストラクタがunlock()を呼び出します。だから、それは範囲外になると解放されます。

http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

だけでなく、それはRAIIスタイルのロックを提供しない、それはまた、ロック()メンバ関数が明示的に呼び出されるまで、ロックを獲得延期することができます、またはでロックを取得しようとして参照してください。ノンブロッキングファッション、またはタイムアウトを使用します。したがって、unlock()は、ロックオブジェクトがLockableオブジェクトをロックしている場合、またはロック可能オブジェクトに対してロックを採用した場合にのみ、デストラクタで呼び出されます。

+0

返信いただきありがとうございます。有効範囲外になったときにboost :: unique_lockが自動的にロック解除された場合、boost :: unique_lockとboost :: mutex :: scoped_lockの違いは何ですか?ありがとう。 – 2607

+0

また、参照を指摘していただきありがとうございますが、ここではちょっと混乱しています。範囲外になったときにデストラクタが自動的に呼び出されますか? – 2607

+5

'scoped_lock'は' unique_lock 'のtypedefです。ブロック{}内で宣言された自動変数はブロックの終わりに達すると破壊され、[RAIIパターン](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)が可能になります。 – jspcal

関連する問題