1

私はC++でスレッドセーフなクラスを書いています。そのパブリックメソッドはすべて、ロック(非再帰的スピンロック)を使用します。プライベートメソッドはロックフリーです。したがって、すべてがOKである必要があります。ユーザーがパブリックメソッドを呼び出し、オブジェクトをロックしてから、プライベートメソッドを介して作業を行います。しかし、パブリックメソッドが別のパブリックメソッドを呼び出すと、デッドロックが発生しました。再帰的ミューテックスは悪いので、デバッグが難しいと読んだことがあります。したがって、Cのstdioの方法を使用します。パブリックメソッドFoo()はオブジェクトをロックするだけで、Foo_nolock()を呼び出してすべての作業を実行します。しかし、私はこれらの_nolock()メソッドが好きではありません。私のコードと重複していると思います。そこで、私はアイデアを思いつきました。ロックのないクラスBarNoLockと、メンバーが1つだけのスレッドセーフなクラスBar(BarNoLockのインスタンス)を作成します。そして、すべてのBarのメソッドは、このメンバーをロックして、そのメソッドを呼び出すだけです。それは良い考えですか、それとももっと良いパターン/実践があるのでしょうか?ありがとう。更新:私はpimplとbridgeについて知っています。

4

2 に答える 2

1

再帰的ミューテックスがなぜ悪いと見なされるのかわかりません。それらの説明については、この質問を参照してください。

再帰的ロック(Mutex)と非再帰的ロック(Mutex)

しかし、Win32のクリティカルセクションは、ブロックせずに同じスレッドからの複数のエントリをサポートしているため、必ずしもそれが問題になるとは思いません。ドキュメントから:

スレッドがクリティカルセクションを所有している場合、その実行をブロックすることなく、EnterCriticalSectionまたはTryEnterCriticalSectionへの追加の呼び出しを行うことができます。これにより、スレッドがすでに所有しているクリティカルセクションを待機しているときに、スレッドがデッドロックするのを防ぎます。所有権を解放するには、スレッドがクリティカルセクションに入るたびにLeaveCriticalSectionを1回呼び出す必要があります。待機中のスレッドがクリティカルセクションの所有権を取得する順序についての保証はありません

それで、あなたが自分自身を行き詰まらせていたとき、多分あなたは何か他の間違ったことをしていましたか?奇妙な関数呼び出しセマンティクスを使用して、同じスレッドから同じミューテックスでデッドロックしないように回避する必要はありません。

于 2010-08-16T17:27:53.693 に答える
1

ブリッジパターンを再発明したようです。順番に完璧に聞こえます。

于 2010-08-16T17:23:01.373 に答える