J'utilise IOCP sur socket UDP, et le socket UDP peut être fermé dans un autre thread. Alors, comment puis-je libérer Per Socket Context et Per I/O Context qui associé à SOCKET en toute sécurité?Port d'achèvement d'E/S, Comment libérer le contexte par socket et le contexte d'E/S?
Lorsque je ferme le socket, il y aura toujours une demande d'E/S non terminée dans la file d'attente du noyau.
Si je libère le contexte juste lorsque le socket est fermé, le GetQueueCompletionStatus peut échouer. Maintenant, ma question est de savoir quand libérer le contexte?
Quels sont les paquets en attente? par exemple. Si une lecture et une écriture sont en attente, vous ne savez pas laquelle renverra ERROR_OPERATION_ABORTED en premier, n'est-ce pas? –
Ok. Vous obtenez toujours la clé d'achèvement valide et le paramètre chevauché renvoyé par GetQueuedCompletionStatus(), même avec ERROR_OPERATION_ABORTED. Vous pouvez utiliser l'un ou l'autre pour le contexte que vous voulez libérer. –
Mon point est si vous avez * deux * une écriture et une lecture (donc 2 structures OVERLAPPED en attente d'achèvement d'E/S), vous ne savez pas lequel des deux sera terminé en premier, et qui sera complété en dernier (même si les deux renvoie ERROR_OPERATION_ABORTED ou pas), vous aurez besoin d'un compteur atomique pour établir lequel sera complété * last * et ensuite appeler une routine de nettoyage à partir de là pour libérer la mémoire –