だから私は、それがまだ接続されているかどうかをチェックするスレッドで実行されているいくつかのネットワークのものを持つクラスのオブジェクトを含むコンテナ(あらゆる種類、おそらくstd::mapまたはstd::vector)を持っています(スレッドはそのクラス内で定義されており、構築時に起動します)。
オブジェクトが切断されたときにコンテナからそれ自体を削除する方法はありますか、それともスレッドをオブジェクトの外に移動し、そのクラスを使用してデータを保存する必要がありますか?
だから私は、それがまだ接続されているかどうかをチェックするスレッドで実行されているいくつかのネットワークのものを持つクラスのオブジェクトを含むコンテナ(あらゆる種類、おそらくstd::mapまたはstd::vector)を持っています(スレッドはそのクラス内で定義されており、構築時に起動します)。
オブジェクトが切断されたときにコンテナからそれ自体を削除する方法はありますか、それともスレッドをオブジェクトの外に移動し、そのクラスを使用してデータを保存する必要がありますか?
オブジェクトがコンテナからそれ自体を削除するには、それがどのコンテナにあるかを知る必要があります。オブジェクト内のコンテナへのポインタを維持する必要があります。また、複数のスレッドがコンテナーに同時にアクセスするのを防ぐために、コンテナーをロックで保護する必要があります。
私はあなたの2番目の解決策を好むと思います.コレクションから死んだオブジェクトを削除した後、いくつかの管理オブジェクトが見えます。何よりも、これはデバッグがかなり簡単になり、ロック ロジックが 1 つのオブジェクトに集中化されます。
アンロードキューがあります。
スレッドが接続がダウンしていることに気付くと、オブジェクト (およびコンティナー) をアンロード キューに登録し、可能な限りすべてを調整してスレッドを終了します。
その後、別のスレッドがアンロード キュー内にあります。その唯一の目的は、キューを監視することです。キューに新しいオブジェクトがある場合は、コンテナーから削除してから破棄します (必要に応じてオブジェクト スレッドと同期します)。
STL コンテナーは、値を格納していると想定する傾向があります。コピー可能で、コピーが同一であるオブジェクト。通常、スレッドを持つオブジェクトはそのモデルにあまり適合しません。彼らははるかに強いアイデンティティーを持っています。この場合、間違いなくインデントがあります。コンテナー内のオブジェクトのコピーは、外部のコピーとは異なります。
私はあなたと非常によく似た問題を抱えていました。これは、コンテナを管理するオブジェクトによってキャッチされ、切断を検出したときに「ネットワークのもの」からブースト::シグナルを発行することで解決しました。そのシグナルを受信すると、コンテナーを反復処理し、デッド ネットワーク セッションをコンテナーから削除します。ここでそれを見る価値があるかもしれません:
C++ boost::signal を、それを放出するオブジェクトをカプセル化するオブジェクトからキャッチする方法は?
乾杯、
クラウディオ