このアプリケーションでは、ワーカー スレッドで処理され、表示スレッドでアクセスされるデータを処理し、クリティカル セクションを処理するミューテックスを使用しています。特にない。
ここで、データを保持および処理する当事者によって現在ロックが明示的に行われているコードを作り直すことを考えました。データを保持し、保護された方法でのみデータへのアクセスを許可する単一のエンティティを考えました。
このために、GuardedData というクラスがあります。呼び出し元はそのようなオブジェクトを要求でき、ローカル スコープで短時間だけ保持する必要があります。オブジェクトが生きている限り、ロックを保持します。オブジェクトが破棄されるとすぐに、ロックが解除されます。データ アクセスは、呼び出し元での明示的な追加作業なしで、ロック メカニズムと結合されます。クラスの名前は、呼び出し元に現在のガードを思い出させます。
template<typename T, typename Lockable>
class GuardedData {
GuardedData(T &d, Lockable &m) : data(d), guard(m) {}
boost::lock_guard<Lockable> guard;
T &data;
T &operator->() { return data; }
};
繰り返しますが、非常に単純な概念です。operator-> は、ペイロードにアクセスするための STL イテレータのセマンティクスを模倣します。
今、私は疑問に思います:
- このアプローチはよく知られていますか?
- このようなテンプレート化されたクラスは、ブースト ライブラリなどで既に利用可能ですか?
それはかなり一般的で使用可能な概念だと思うので、私は尋ねています。私はそれのようなものを見つけることができませんでした。