2016-09-05 26 views
4

現在、std::mutexについて学んでいて、助けが大好きです。私がどのように見えるコードしている場合 -ブロックの内側にあるstd :: lock_guardのスコープ

.... 
if(returnBoolValue()) 
{ 
    std::lock_guard<std::mutex> lock(mutex_var); 
    .... 
    .... 
} 
.... 

を条件であれば内部の値を返す関数を守っstd::lock_guardのですか?すなわち、 returnBoolValue()

可能であれば、関数呼び出しがガード内にあるように、どのように改善する必要がありますか?


+1

mutexは、 'returnBoolValue'の後の全てと' if'スコープの中の部分だけを保護します。 '証明する 'とはどういう意味ですか?改善する?どのように改善しますか? – Hayt

+0

@Hayt returnBoolValue()もガードの対象にする必要があります。 –

答えて

8

(C++ 17がこれを行う方法を持っている)

ソリューションは

.... 
{ 
    std::lock_guard<std::mutex> lock(mutex_var); 
    if(returnBoolValue()) 
    { 
     .... 
     .... 
    } 
} 
.... 

C++ 17の方法だろう。

.... 
if(std::lock_guard<std::mutex> lock(mutex_var); returnBoolValue()) 
{ 
    .... 
    .... 
} 
.... 
+0

C++の17の方法では、 ''部分も省略できます – Cubbi

3

のstd ::ある状態であれば内部の値を返す関数を守っlock_guard?すなわち、 returnBoolValue()

いいえ。クリティカルセクションはガードの宣言ポイントから始まります。ガードは条件の後で宣言されているため、ガードされていません。

そして、どのように私はあなたの条件が同様に守らする必要がある場合には、if文の前にガードを動かし、それを

を向上させる必要があります。現在、それは別の範囲を追加することなく、これを実行することはできません

4

ロックガードは、作成時にmutexをロックします。すなわち、プログラムの制御フローがlockという宣言に達するとロックガードがロックされます。ブロックが終了するときに(自然にそこを流れるか、returnthrow、またはジャンプステートメントによって "強制"されて)、制御が流れて、ガードが破壊されたときにミューテックスを解放(ロック解除)します。

{ 
    std::lock_guard<std::mutex> lock(mutex_var); 
    if(returnBoolValue()) 
    { 
    .... 
    .... 
    } 
} 

注意私は "lock + ifの周りに余分なブロックを追加しました:lock変数の有効範囲を拡張:もちろん

これはまた、ミューテックスで「保護」範囲を拡張する方法を示しています"ペアを使用して、ifブロックが終了するとmutexがロック解除されていることを確認します。

関連する問題