2016-07-12 14 views
3

基本的に、タイトルは自明です。 私は次のように使用します:std :: mutexロック関数とstd :: lock_guardの相違点<std::mutex>?

  • コードはObjective-C++です。
  • Objective-Cクラスは、異なる目的関数への同時呼び出しを行います。
  • C++標準コンテナはスレッドセーフではないため、std::mutexlockunlockstd::vector<T>の編集オプションをクラス全体で使用します。 std::lock_guard

答えて

3

lock_guardを使用すると、範囲外になったときに再び自動的にロックアウトされます。そのため、ロックを解除したり、戻ったり、例外がスローされたりするのを忘れることは不可能です。 常にmutex::lock()の代わりにlock_guardまたはunique_lockを使用することをお勧めします。 http://kayari.org/cxx/antipatterns.html#locking-mutex

lock_guardは、RAIIまたはSBRMタイプの例です。

0

は、2つだけの目的のために使用される:破壊時

  1. 自動化ミューテックスのロック解除(.unlock()を呼び出す必要はありませんが)。
  2. デッドロックの問題を克服するために、複数のmutexの同時ロックを許可します。 、あなたのように、ガードのためにあなたがミューテックスをロックする必要があるたびに、さらに別のクラスのインスタンスを割り当てる必要があります。一方

    std::lock(mutex_one, mutex_two); 
    std::lock_guard<std::mutex> lockPurposeOne(mutex_one, std::adopt_lock); 
    std::lock_guard<std::mutex> lockPurposeTwo(mutex_two, std::adopt_lock); 
    

    :最後のユースケースについては

あなたはstd::adopt_lockフラグが必要になりますstd::lock_guardにはメンバー機能がありません。機能のロックを解除してガードが必要な場合は、std::unique_lockクラスをご覧ください。また、ベクトルの並列読み込みにはstd::shared_lockを使用することを検討することもできます。

std::shared_lockクラスはヘッダーファイルにコメントされており、C++でしかアクセスできません。ヘッダファイルによれば、std::shared_timed_mutexを使用することができますが、アップルがヘッダファイルを更新したが、libC++自体は更新していないため、アプリケーションをビルドしようとすると失敗します。

Objective-Cアプリケーションでは、GCDを使用する方が便利です。すべてのC++コンテナに同時に2つのキューを割り当て、必要に応じてセマフォを配置します。この優れたcomparisonを見てください。

+0

_「あなたがmutexをロックする必要があるたびにガードに別のクラスインスタンスを割り当てる必要がありますか?」という意味ですか? 'lock_guard'が悪いように聞こえます。 –

+0

あなたがそれを必要とするならば悪くない。しかし途中でアプリを構築すると、そのデッドロックは不可能になります。あなたはそれを必要としません。 –

関連する問題