1

時々オブジェクトを遅らせて処理する必要があります。ただし、オブジェクトを保持しているスレッドは遅延できません。

自然な解決策は、そのようなオブジェクトを待機する別のスレッドを用意することです。オブジェクトが使用可能になると、この2番目のスレッドは必要に応じて遅延し、オブジェクトを処理します。2番目のスレッドはセマフォでスリープします。メインスレッドに遅延処理用のオブジェクトがある場合、メインスレッドはそのオブジェクトをキューに入れ、セマフォに信号を送ります。

これは機能しますが、別のプログラマー(または私)がオブジェクトをキューに入れるときにセマフォに信号を送るのを忘れる可能性があるというリスクがあります。これを強制してほしい。

したがって、標準のコンテナーに基づいているが、コールバック(おそらくポリシーベースの設計を使用)と内部セマフォを追加して、独自のコンテナーを作成する場合があります。アイテムがコンテナに追加されたときに、コールバック関数の実行を強制します。

しかし、この機能は非常に便利で一般的に望まれているので、誰かがすでにこれを書いていると思います。おそらく、ここで提案しているよりも優れたデザインで、再入可能性などの毛深い詳細に対処しています。このためのライブラリは存在しますか?または、この機能を取得するためのよく知られた手法はありますか?

4

1 に答える 1

0

usingこれには、宣言とともにプライベート継承を使用しました。

struct myVec : private std::vector<int> {
 // Stuff that works the same
 using std::vector<int>::push_back;
 using std::vector<int>::erase;
 using std::vector<int>::iterator;

 // Stuff that works differently:
 void erase(std::vector<int>::iterator it) { ... }
};

標準コンテナーからの公開継承を使用しないことが重要です。スライシングと非仮想デストラクタに関連するバグを書くことになります。

于 2012-10-26T23:20:15.387 に答える