[解決済み】 std::unique_lock<std::mutex> と std::lock_guard<std::mutex> のどちらを選ぶ?
質問
2つのユースケースを持っています。
A. 2つのスレッドのキューへのアクセスを同期させたいと思います。
B. 私は2つのスレッドのキューへのアクセスを同期させ、スレッドの1つが他のスレッドによってキューに格納されるコンテンツを待つので、条件変数を使用したいと思います。
使用例 A では、以下のコード例を参照してください。
std::lock_guard<>
. ユースケース B では、次のようなコード例があります。
std::unique_lock<>
.
この2つの違いは何ですか?また、どのようなユースケースでどちらを使えばいいのでしょうか?
どのように解決するのですか?
のロックとアンロックができる点が異なります。
std::unique_lock
.
std::lock_guard
は、建設時に一度だけロックされ、破壊時にロックが解除されます。
したがって、ユースケースBの場合は、間違いなく
std::unique_lock
を条件変数として使用します。ケースAでは、ガードを再ロックする必要があるかどうかによります。
std::unique_lock
には他の機能もあり、例えば、すぐにミューテックスをロックせずに RAII ラッパーを構築することができます (
ここで
).
std::lock_guard
も便利な RAII ラッパーですが、複数の mutex を安全にロックすることはできません。これは、例えばメンバ関数のような限定されたスコープのラッパーが必要な場合に使用します。
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
}
};
chmikeの質問を明確にするために、デフォルトでは
std::lock_guard
と
std::unique_lock
は同じです。
ですから、上記の場合、次のように置き換えることができます。
std::lock_guard
で
std::unique_lock
. しかし
std::unique_lock
は、もう少しオーバーヘッドがあるかもしれません。
なお、最近(C++17以降)は
std::scoped_lock
の代わりに
std::lock_guard
.
関連
-
[解決済み] テスト
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
-
[解決済み] Java:notify()対notifyAll()の繰り返し
-
[解決済み] C++によるスレッディングの簡単な例
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】 std::lock_guard と std::scoped_lock どっちがいい?