2012-05-06 2 views
7

En linux.Quoi de mieux: Sélectionnez vs Threads?

Je veux construire un autoclicker qui aura une fonction d'activation/désactivation quand une touche est pressée. Evidemment il doit y avoir 2 choses fonctionnant en parallèle (le clicker lui-même, et la fonction enable/disable)

Quels sont les inconvénients et les avantages de chaque implémentation: Utilisation d'un thread qui va gérer la fonction d'autoclicking et un autre thread principal (pour l'activation/désactivation etc ...) Ou en utilisant le syscall sélectionnez et attendez la saisie/clavier?

+2

Vous pouvez le faire de toute façon. Quelles mesures définissent "mieux" ici? –

+1

Je veux juste savoir quels sont les avantages de chaque option – Jah

+1

@Jah: Alors vous auriez dû demander cela, au lieu de demander ce qui était "mieux". –

Répondre

7

L'utilisation de select est préférable pour les performances, en particulier lorsque vous avez potentiellement des centaines d'opérations simultanées. Cependant, il peut être difficile d'écrire le code correctement et le style de codage est très différent de la programmation traditionnelle à un seul thread. Par exemple, vous devez éviter d'appeler des méthodes de blocage car cela pourrait bloquer l'ensemble de votre application.

La plupart des gens trouvent que l'utilisation de threads est plus simple car la majorité du code ressemble à du code monothread ordinaire. La seule partie difficile est dans les quelques endroits où vous avez besoin de communication inter-thread, via des mutex ou d'autres mécanismes de synchronisation.

Dans votre cas spécifique, il semble que vous n'ayez besoin que d'un petit nombre de threads, donc je choisirais le modèle de programmation plus simple en utilisant des threads.

+5

Citation nécessaire pour la première phrase. Je suppose que sur les systèmes modernes, c'est beaucoup plus compliqué que cela. Certainement avec * beaucoup * de descripteurs de fichiers en action, les threads permettent au noyau de simplement réveiller le thread qui est bloqué plutôt que "select" d'avoir à balayer plusieurs fois "N" bits dans un tableau et de se retirer d'une file d'attente pour chaque . Les threads semblent également pouvoir optimiser pour le moins de transitions utilisateur-noyau. Il y a peut-être d'autres raisons orthogonales qui sont plus lentes, mais je ne pense pas que ce soit si simple. –

1

Étant donné la quantité de travail que vous faites, cela n'a probablement pas d'importance.

Pour les applications hautes performances, il existe une différence. Dans ces cas, vous devez gérer plusieurs milliers de connexions simultanément; dans de tels cas, vous passez de nouvelles connexions à de nouveaux threads.

La création de plusieurs milliers de threads est onéreuse, donc la sélection est utilisée pour l'efficacité. En fait différentes techniques telles que kqueue ou epoll sont utilisées pour une commutation optimale.

Je dis que cela n'a pas d'importance, car vous ne créerez probablement le thread qu'une fois et aurez exactement deux threads en cours d'exécution pour la durée de vie de l'application.