2017-06-16 4 views
0

La plupart des applications que j'ai fait avec libevent impliquent un rappel de lecture et chaque fois qu'une nouvelle connexion est ouverte pour une demande que j'allouent un nouvel événement avec ::event_new() puis ajouter cet événement à la base d'événements via ::event_add()Comment partager callbacks dans libevent

Mais le problème est que chaque fois qu'une nouvelle requête est ouverte, j'alloue de la mémoire et l'ajoute à la boucle d'événements, alors qu'en réalité je devrais partager des rappels et des événements pour des descripteurs de fichiers. L'allocation de mémoire accordée n'est pas un goulot d'étranglement pour une telle application, libevent offre-t-elle un moyen de partager des événements avec plusieurs descripteurs de fichiers?

+1

Que signifie «partage des rappels et des événements pour les descripteurs de fichiers» dans votre question? Les allocations de mémoire sont inévitables pour stocker l'état d'une connexion pour le traitement. Un 'événement' a son état complètement différent de tout autre événement. Comment pouvez-vous partager cela pour réaliser différentes fonctionnalités? Et, 'des descripteurs de fichiers 'non utilisés (fermés) sont réutilisés par le système d'exploitation pour' select', 'poll',' epoll', etc. Pouvez-vous élaborer un peu plus sur ce que vous voulez exactement faire? – Azeem

+0

@Azeem j'ai demandé puisque tous les événements de lecture que j'ai sont les mêmes sauf pour le descripteur de fichier qu'ils attendent – Curious

+0

Pouvez-vous donner un exemple de code? Veuillez éditer votre question avec un exemple de code de support. – Azeem

Répondre

1

Vous ne devez pas partager d'événements entre les descripteurs de fichier. Cela créerait le chaos dans votre application. event_new() crée un événement attaché à votre descripteur de fichier.

Vous pouvez essayer de réaffecter des événements passés en utilisant event_assign() mais la documentation de libevent indique spécifiquement que cela n'est pas recommandé. De plus, la gestion des événements dépensés dans un pool quelconque n'est peut-être pas aussi triviale qu'elle en a l'air, et il n'y aura probablement pas de gains de performance notables.

+0

Pourriez-vous donner un exemple de ce que vous entendez par chaos? Tous les événements de lecture que je crée sont les mêmes à l'exception du descripteur de fichier donné. Im essayant juste de comprendre les modèles snd d'utilisation corrects ici – Curious

+0

Les événements sont liés au socket, et le feu sur les événements sur ce socket. Attacher un événement à plus d'un socket actif conduira à un comportement indéfini. Cela signifie que votre programme bombardera immédiatement ou agira de manière indéfinie - ce qui signifie que tout type de bogue peut survenir à partir de ce moment-là, comme des événements déclenchés sur le mauvais socket, un socket mort, une fuite de mémoire, introuvable la corruption de la mémoire et les goûts. –