基本的に、タイトルは自明です。 私は次のように使用します:std :: mutexロック関数とstd :: lock_guardの相違点<std::mutex>?
- コードはObjective-C++です。
- Objective-Cクラスは、異なる目的関数への同時呼び出しを行います。
- C++標準コンテナはスレッドセーフではないため、
std::mutex
〜lock
とunlock
std::vector<T>
の編集オプションをクラス全体で使用します。std::lock_guard
基本的に、タイトルは自明です。 私は次のように使用します:std :: mutexロック関数とstd :: lock_guardの相違点<std::mutex>?
std::mutex
〜lock
とunlock
std::vector<T>
の編集オプションをクラス全体で使用します。 std::lock_guard
lock_guard
を使用すると、範囲外になったときに再び自動的にロックアウトされます。そのため、ロックを解除したり、戻ったり、例外がスローされたりするのを忘れることは不可能です。 常にはmutex::lock()
の代わりにlock_guard
またはunique_lock
を使用することをお勧めします。 http://kayari.org/cxx/antipatterns.html#locking-mutex
は、2つだけの目的のために使用される:破壊時
.unlock()
を呼び出す必要はありませんが)。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を見てください。
_「あなたがmutexをロックする必要があるたびにガードに別のクラスインスタンスを割り当てる必要がありますか?」という意味ですか? 'lock_guard'が悪いように聞こえます。 –
あなたがそれを必要とするならば悪くない。しかし途中でアプリを構築すると、そのデッドロックは不可能になります。あなたはそれを必要としません。 –