epoll_waitを使用して複数のスレッドを使用する複数の接続を管理すると、閉じたソケットに関連付けられたカスタムデータを解放しようとするリスクがあります。
次のシナリオを考えてみましょう。ここで、Tはカスタムデータです。
- データを受信し、
- 1のため、スレッドAはepoll_waitからブロックを解除し、イベントを処理します(アクセスT)
- 同時に、別のスレッドBが接続を閉じようとしています
スレッドBは、Tを安全に削除できるとは想定できませんが、closeを呼び出すと、すぐにソケットがepollから削除されます。
私は次の標準的な考えを持っていました:
書き込み/読み取りの呼び出しがEAGAINを返すたびにインクリメントされ、ソケットの準備ができるたびにデクリメントされるT内の変数を維持します。closeが呼び出されたら、その変数がゼロになるのを待ってからTを削除します。私が経験した問題は、closeが呼び出された場合、epoll_waitがソケットを準備するための以前の呼び出しのキャンセルの表示を返さないことです。
誰かがこれと同じ問題を抱えていましたか?どのようにしてそれを克服することができましたか?