2017-03-25 12 views

答えて

20

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

+2

わずか10分後に自分の質問に答えました。あなたは本当に知りませんでしたか? – Walter

+5

@Walter私はhttps://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/ – inf

+0

を行った@Ruslanあなたが何を意味するかわからない。 10分の遅れはなかった。質問を作成するときには、すでに回答を提供することができます。 – inf

34

scoped_lockが一斉にミューテックスの任意の数(std::lockと同じデッドロック回避アルゴリズムを使用して)ロックlock_guardの厳密に優れたバージョンで読みたいと思うかもしれません。新しいコードでは、scoped_lockのみを使用してください。

lock_guardの唯一の理由は互換性のためです。現在のコードで使用されているため、削除できませんでした。さらに、それはまた観察可能であり、それゆえに壊れた変化である(しかし幾分技術的理由のために)その定義を(単項から可変に)変えることは望ましくないことが判明した。

+4

また、クラステンプレート引数の控除のおかげで、ロック可能な型をリストする必要はありません。 –

+2

@NicolBolas:そうですが、これは 'lock_guard'にも当てはまります。しかし、それは確かにガードクラスを少し使いやすくします。 –

関連する問題