私は、2つのboost :: scoped_locksを同時に保持すると問題があるかどうかを知りたいと思います。ロックは異なるmutexをロックしています。次の例を考えてみましょう。同時に2つのミューテックスロックを保持する
void foo1()
{
boost::recursive_mutex::scoped_lock lock(mutex1);
foo2();
}
void foo2()
{
boost::recursive_mutex::scoped_lock lock(mutex2);
}
これはデッドロックを引き起こすものではないことがわかります。しかし、他の問題はありますか?スレッドが長時間スリープする可能性がありますか?
ありがとうございました! :) –
ロックの順序を保証する1つの方法は、mutexes/locksの周りに軽量のラッパーを置き、レイヤーiのコンストラクターがレイヤー(i-1)の取得したロックのconst refを取るようにすることです。そうすれば、他の方法で構築することはできません。または、C++ 17を使用して同時にロックします。 – lorro
@lorro私はこの問題に対処する方法がたくさんあることをよく承知しています。しかし、私は問題の実装を解決する方法をアドバイスするつもりではなく、潜在的な問題とは何かを指摘することとそれを回避する一般的なルールを指摘することでした。実装は読者のための練習として残しました。 :-) –