0

アクティブな接続を追跡したい場合、それらをリンク リストに保存するか、インデックスが接続の ID を表す配列に直接保存する方がよいでしょうか? たとえば、次のような競合状態の問題を回避したいと考えています。

  • リスト内の接続数が多い
  • 誰かがリストの最後にある接続を探し始めます
  • その間、検索中に接続が切断されます
4

1 に答える 1

0

構造体には、接続ハンドル (SOCKET)、参照カウント、および接続を閉じてオブジェクトをできるだけ早く削除する必要があることを示すフラグが含まれている必要があります。コンテナーが何であれ、検索/挿入/削除、および GetReference/Release ロジックのための同期メカニズム (クリティカル セクション) が必要です。終了フラグが発生した場合、GetReference 関数は NULL を返す必要があります。検索条件によっては、複数の GetReference が必要になる場合があります (接続オブジェクトには、コンテナー内での検索に役立つすべての値が必要です)。GetReference 関数の 1 つは、コンテナーに存在しない場合、新しいオブジェクトを作成できます。

終了フラグが立てられ、参照カウントがゼロになった場合、リリース関数は接続を閉じてコンテナからオブジェクトを削除する必要があります。ただし、リリースはクリティカル セクション内で接続を閉じてはなりません。これは、時間のかかる操作になる可能性があるためです (正常なシャットダウンと残留オプションに依存します)。Release は CS に入り、参照カウントを減らします。ゼロの場合は CS を離れ、接続を閉じ、再び CS に入り、コンテナからオブジェクトを削除して削除します。終了フラグが立てられているため、参照カウントは 2 つの CS 間で発生しません。

于 2010-11-09T09:56:02.013 に答える