複数のプロジェクト間で共有されるクラスがあり、その一部はシングルスレッドで使用され、一部はマルチスレッドで使用されます。シングルスレッド ユーザーはミューテックス ロックのオーバーヘッドを望んでおらず、マルチスレッド ユーザーは独自のロックを実行したくなく、オプションで「シングルスレッド モード」で実行できるようにしたいと考えています。したがって、実行時に実際のミューテックスと「ダミー」ミューテックスを選択できるようにしたいと考えています。
理想的にはshared_ptr<something>
、実際のミューテックス オブジェクトまたは偽のミューテックス オブジェクトを割り当てます。次に、その内容に関係なく、これを「ロック」します。
unique_lock<something> guard(*mutex);
... critical section ...
現在は がありますがsignals2::dummy_mutex
、 と共通の基本クラスを共有していませんboost::mutex
。
では、上記の例よりもロック/ガード コードを複雑にすることなく、実際のミューテックスとダミー ミューテックス (signals2 のいずれかまたは他のもの) を選択するエレガントな方法は何ですか?
そして、代替案を指摘する前に:
- コンパイル時に実装を選択することもできましたが、プリプロセッサ マクロは見苦しく、プロジェクトの構成を維持するのは大変です。
- マルチスレッド環境でのクラスのユーザーは、クラスが内部で独自のロックを行うよりも、クラスの使用をロックする責任を負いたくないでしょう。
- 「スレッドセーフなラッパー」が実用的なソリューションになるには、あまりにも多くの API と既存の使用法が関係しています。