J'ai 2 questions:Comment mettre en œuvre une minuterie asynchrone sur un système * nix en utilisant pthreads
Q1) Puis-je mettre en œuvre une minuterie asynchrone dans un i.e. d'application unique filetée je veux une fonctionnalité comme celui-ci. Dans la mesure où je peux penser que cela ne peut pas être fait pour une seule application filetée (corrigez-moi si je me trompe). Je ne sais pas si cela peut être fait en utilisant select comme démultiplexeur, mais même si select pourrait être utilisé, la boucle d'événement nécessiterait un thread? N'est-ce pas?
Je veux aussi savoir si je peux mettre en œuvre une minuterie (pas timeout) en utilisant select. Sélectionnez uniquement les attentes sur l'ensemble des descripteurs de fichiers, mais je veux avoir une liste de temporisateurs dans l'ordre croissant de leurs délais d'expiration et que vous voulez sélectionner pour me dire quand le premier temporisateur expire et ainsi de suite. Donc la question se résume à peut-on mettre en œuvre un temporisateur asynchrone en utilisant select/poll ou un autre démultiplexeur d'événements? Q2) Passons maintenant à ma deuxième question. Ceci est ma question principale. Maintenant, j'utilise un thread dédié pour vérifier les délais d'attente, c'est-à-dire que j'ai un min tas de temporisateurs (temps d'expiration) et ce thread dort jusqu'à ce que le premier temporisateur expire, puis invoque le rappel. -à-dire le code ressemble à ceci
- verrouiller le mutex
- vérifier le temps de la première minuterie
- état chronométré attente pour ce moment-là (et se réveiller si un autre thread insère une minuterie avec le temps d'expiration moins que le premier temporisateur) L'attente de condition déverrouille le verrou.
- Une fois la condition d'attente terminée, nous avons le verrou. Alors, déverrouillez-le, supprimez la minuterie du tas et appelez la fonction de rappel.
- aller à 1
Je veux que la complexité temporelle de cette horloge asynchrone. D'après ce que je vois
- insertion est lg (n)
- expiration est lg (n)
- Annulation
:(c'est ce qui me donne le vertige), le problème est que j'ai un min tas de minuteries en fonction de leur temps et quand j'insère une minuterie je reçois un identifiant unique. Donc, quand j'ai besoin d'annuler la minuterie, je dois fournir cette identification de la minuterie et la recherche de cet identifiant dans le tas prendrait dans le pire des cas O (n)
Ai-je tort?
Peut-annulation se faire en O (logn)
S'il vous plaît ne prenez pas soin de certains problèmes de multithreading. Je voudrais préciser ce que je veux dire par ma phrase précédente une fois que j'obtiens des réponses.
Sur quelle plate-forme écrivez-vous? Par exemple, Windows a des appels d'API qui permettent à une application à un seul thread d'utiliser un minuteur. Ou essayez-vous d'écrire votre propre système d'exploitation? – JustLoren
Salut à tous, Je travaille sur * système nix i.e tout système compatible de Posix Linux, Solaris et autres unices. J'utilise des pthreads. – ghayalcoder