44

boost::mutexから使いますboost/thread/mutex.hpp。ミューテックスscoped_lockをロック/ロック解除するにはunique_lock、いくつかの方法があります。lock_guard::lock()::unlock()lock()unlock()

これはboost::scoped_mutexミューテックスを使用する最も一般的な方法の 1 つです。メンバー関数::lock()やよりも好ましいのはなぜ::unlock()ですか?

特に、なぜ使用する必要があるのですか

{
  boost::scoped_lock lock(mutex)
  // ...
  // read/output sharing memory.
  // ...
}

それよりも

mutex.lock()
// ...
// read/output sharing memory.
// ...
mutex.unlock()

scoped_lockいくつかのスタイルコーディングの観点から優れているか、それとも「スレッドセーフで十分」ではありませ::lock()/::unlock()んか?

4

2 に答える 2

76

メンバー関数 ::lock() および ::unlock() よりも好ましいのはなぜですか?

RAII イディオムが一般的に普及したのと同じ理由で (これはその無数のインスタンスの 1 つにすぎません): ミューテックスのロックを解除せずに現在のスコープを離れることを確実にできるからです。

これは単にを呼び出すのを忘れているだけではないことに注意してunlock()ください。ミューテックスがロックされている間に例外が発生し、 への呼び出しと への呼び出しの間にステートメントunlock()がなくても、 への呼び出しに到達しない場合があります。returnlock()unlock()

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

この場合、scoped_lockガードのデストラクタは、スタックの巻き戻し中に呼び出され、関連するミューテックスが常に解放されるようにします。

{
    boost::scoped_lock lock(m); // m is a mutex
    // ...
    foo(); // If this throws, your RAII wrapper will unlock the mutex
    // ...
}

unlock()さらに、多くの場合、すべてのreturnステートメントの前に呼び出しを追加する必要がないため、コードの可読性が向上します。

于 2013-03-02T21:21:37.903 に答える
7

あなたが使用することができます

std::lock_guard<std::mutex> lock(mutex);

ブーストライブラリを使用したくない場合。

于 2016-04-26T14:21:31.457 に答える