Question

Je lis des données à partir de plusieurs ports série. Actuellement, j'utilise un gestionnaire de signal personnalisé (en définissant sa_handler) pour comparer et réactiver les threads en fonction des informations du descripteur de fichier. Je cherchais un moyen de disposer de threads individuels avec des gestionnaires de signaux uniques. À cet égard, j'ai constaté que l'appel système à sélectionner devait être utilisé.

J'ai maintenant les questions suivantes:

  1. Si j'utilise un thread (Qt), où dois-je placer l'appel système sélectionné pour surveiller le port série?
  2. Le thread d'appel système sélectionné est-il sécurisé?
  3. Est-ce une utilisation intensive du processeur, car de nombreuses choses se passent dans mon application, y compris la mise à jour de l'interface graphique?

S'il vous plaît ne vous dérange pas, si vous trouvez ces questions ridicules. Je n'ai jamais utilisé un tel mécanisme pour la communication série.

Était-ce utile?

La solution

La spécification POSIX (select) est l'endroit à rechercher la select définition. Personnellement, je recommande poll - il a une meilleure interface et peut gérer n’importe quel nombre de descripteurs, au lieu d’une limite définie par le système.

Si j'ai bien compris, vous éveillez les discussions en fonction de l'état de certains descripteurs. Une meilleure façon serait que chaque thread ait son propre descripteur et appelle select lui-même. Vous voyez, select ne modifie pas l'état du système, et tant que vous utilisez des variables locales à l'unité d'exécution, cela ne présente aucun risque. Cependant, vous voudrez certainement vous assurer de ne pas fermer un descripteur dont dépend un thread.

L'utilisation de <=> / <=> avec un délai d'attente laisse le & "en attente &"; jusqu'au noyau, ce qui signifie que le fil est généralement mis en veille. Pendant que le thread est en veille, il n’utilise pas de temps processeur. En revanche, une boucle while / for sur un appel <=> sans délai d'attente vous permettra de bénéficier d'une utilisation plus importante de la CPU, car vous tournez constamment dans la boucle.

J'espère que cela vous aidera.

EDIT: De même, <=> / <=> peut avoir des résultats imprévisibles lorsque vous utilisez le descripteur identique dans plusieurs threads. La raison simple en est que le premier thread peut être réveillé parce que le descripteur est prêt à être lu, mais que le second doit attendre que le suivant & Disponible pour la lecture " réveil.

Tant que vous n'êtes pas <=> sur le même descripteur dans plusieurs threads, vous ne devriez pas avoir de problème.

Autres conseils

Il s’agit d’un appel système - il devrait être thread-safe, je pense.

Je ne l'avais pas fait auparavant, mais je serais plutôt surpris si ce n'était pas le cas. L’intensité de l’utilisation du processeur select() dépend largement, à mon avis, du nombre de descripteurs de fichiers que vous attendez. <=> est principalement utilisé pour attendre qu'un certain nombre (> 1) descripteurs de fichier soit prêt.

Il convient également de mentionner que <=> ne doit pas être utilisé pour interroger les descripteurs de fichiers - pour des raisons de performances. L’utilisation normale est la suivante: votre travail est terminé et il peut s’écouler un peu de temps avant la prochaine étape. Maintenant, vous suspendez votre processus avec select et laissez un autre processus s'exécuter. <=> normalement suspend le processus actif. Comment cela fonctionne avec les discussions, je ne suis pas sûr! Je penserais que tout le processus (et tous les threads) sont suspendus. Mais cela pourrait être documenté. Cela peut également dépendre (de Linux) si vous utilisez des threads système ou des threads utilisateur. Le noyau ne connaîtra pas User-Threads et suspendra donc tout le processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top