Sauf si vous voulez écrire votre propre IO pool de threads, la mise en œuvre de la glibc est une solution acceptable. Il fonctionne étonnamment bien pour quelque chose qui fonctionne entièrement en userland.
Le noyau de la mise en œuvre ne fonctionne pas avec tampon IO dans mon expérience (même si j'ai vu d'autres personnes disent le contraire!). Ce qui est bien si vous voulez lire d'énormes quantités de données via DMA, mais bien sûr, il suce le gros temps si vous prévoyez de prendre avantage de la mémoire tampon.
Notez également que le noyau AIO appels peuvent effectivement bloquer. Il y a une limitation de la taille mémoire tampon de commande, et les grandes lectures sont divisés en plusieurs petits. Une fois la file d'attente est pleine, commandes asynchrones exécuter de manière synchrone. Surprise. J'ai rencontré ce problème a un an ou deux et ne pouvait pas trouver une explication. Demander autour m'a donné le "oui bien sûr, c'est comment ça fonctionne" réponse.
De ce que j'ai compris, le "officielle" de l'intérêt à appuyer le tampon aio n'est pas très grand non plus, en dépit de plusieurs solutions de travail semblent être disponibles pendant des années. Certains des arguments que j'ai lu ont été sur les lignes de "vous ne voulez pas utiliser de tampons de toute façon" et "personne n'a besoin que" et "la plupart des gens ne sont même pas utiliser epoll encore". Alors, eh bien... meh.
Être en mesure d'obtenir un epoll
marqué d'une opération asynchrone est une autre question, jusqu'à récemment, mais en attendant, cela fonctionne vraiment bien via eventfd
.
Notez que la glibc mise en œuvre sera fait spawn des fils sur demande à l'intérieur d' __aio_enqueue_request
. Il n'est probablement pas une grosse affaire, depuis la ponte des threads n'est pas que terriblement cher, mais il faut être conscient de cela. Si votre compréhension de démarrage d'une opération asynchrone est "retourne immédiatement", alors que l'hypothèse ne peut pas être vrai, car il peut être frai certains fils en premier.
EDIT:
Au passage, sous Windows, il existe une situation très semblable à celle de la glibc AIO mise en œuvre où le "retourne immédiatement" hypothèse de la mise en attente d'une opération asynchrone n'est pas vrai.
Si toutes les données que vous voulez lire est dans le cache de tampons, Windows va décider à la place d'exécuter la demande de façon synchrone, parce que ça va se terminer immédiatement de toute façon. C'est bien documenté, et, certes, les sons grande, trop. Sauf en cas il y a quelques méga-octets à copier ou dans le cas où un autre thread a des défauts de page ou t IO simultanément (donc en compétition pour le verrouillage de l') "immédiatement" peut être étonnamment longtemps-je l'ai vu "immédiate" de temps de 2 à 5 millisecondes. Ce qui n'est pas un problème dans la plupart des cas, mais par exemple sous la contrainte d'un 16.66 ms cadre de temps, vous avez sans doute ne voulez pas de risque de blocage de 5ms à des moments aléatoires. Ainsi, l'hypothèse naïve de "peut faire async IO de mon thread de rendu, pas de problème, parce que async ne pas bloquer" est erronée.