2017-01-14 5 views
0

2つのコードセグメントは同じ動作をしますか?私は、何かが欠けていない限り、そうすると思います。 注:私はすべての変数がsome_classboostスコープロックの復帰動作

int some_class::some_func() 
{ 
    boost::scoped_lock lock(this->m_mutex); 
    return this->member; 
} 

int some_class::some_func() 
{ 
    this->m_mutex.lock(); 
    int a = this->member; 
    this->m_mutex.unlock(); 
    return a; 
} 

答えて

0

のメンバ変数ですそれはint a = this->member;が例外をスローしないことを前提と同じだということを明確にするためにどこでもこのポインタを使用しています。

+0

ありがとうございます。例外メモに同意します。私は答えを受け入れる – yaGsd

1

いくつかのことを同じようにしていますが、これは単に電話を忘れることだけではありません。mutexがロックされている間に例外が発生する可能性があります。 lock()への呼び出しとunlock()への呼び出しの間にreturn文を持ちます。以下のような :scoped_lockの場合

m.lock() // m is a mutex 
    // do something 
    foo(); // If this throws an exception,that your mutex won't get unlocked 
    // do something 
    m.unlock() 

バールは、scoped_lockガードのデストラクタは、関連するミューテックスが常に解放されることを確認して、スタックの巻き戻し時に呼び出されます。