C++ 17では、std::scoped_lock
という新しいロッククラスが導入されました。std :: lock_guardまたはstd :: scoped_lock?
ドキュメントから判断すると、既存のstd::lock_guard
クラスと似ています。
どのような違いがありますか、いつ使用しますか?
C++ 17では、std::scoped_lock
という新しいロッククラスが導入されました。std :: lock_guardまたはstd :: scoped_lock?
ドキュメントから判断すると、既存のstd::lock_guard
クラスと似ています。
どのような違いがありますか、いつ使用しますか?
std::scoped_lock
は、1つ以上のミューテックスをとる可変的なコンストラクタを持っています。これにより、複数のmutexをデッドロック回避の方法でロックすることができます。std::lock
のように使用します。 this answerが説明したように
{
// safely locked as if using std::lock
std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);
}
は、以前はstd::lock
を使用して安全な方法で複数のミューテックスをロックする少しダンスをしなければなりませんでした。
スコープロックを追加すると、これを使いやすくなり、関連するエラーを回避できます。 std::lock_guard
は非推奨とみなされます。 std::scoped_lock
という単一の引数の場合は、特殊化として実装することができます。そのため、パフォーマンス上の問題を恐れる必要はありません。
GCC 7は既にstd::scoped_lock
をサポートしており、これはhereで見ることができます。
は、より多くの情報のためには、standard paper
scoped_lock
が一斉にミューテックスの任意の数(std::lock
と同じデッドロック回避アルゴリズムを使用して)ロックlock_guard
の厳密に優れたバージョンで読みたいと思うかもしれません。新しいコードでは、scoped_lock
のみを使用してください。
lock_guard
の唯一の理由は互換性のためです。現在のコードで使用されているため、削除できませんでした。さらに、それはまた観察可能であり、それゆえに壊れた変化である(しかし幾分技術的理由のために)その定義を(単項から可変に)変えることは望ましくないことが判明した。
また、クラステンプレート引数の控除のおかげで、ロック可能な型をリストする必要はありません。 –
@NicolBolas:そうですが、これは 'lock_guard'にも当てはまります。しかし、それは確かにガードクラスを少し使いやすくします。 –
わずか10分後に自分の質問に答えました。あなたは本当に知りませんでしたか? – Walter
@Walter私はhttps://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf
を行った@Ruslanあなたが何を意味するかわからない。 10分の遅れはなかった。質問を作成するときには、すでに回答を提供することができます。 – inf