Est-ce que l'appel select () / pselect () en fil secondaire cause de thread principal au bloc?
-
12-10-2019 - |
Question
J'ai une demande que je travaille sur qui nécessite deux threads secondaires, et chacun sera responsable d'un certain nombre de descripteurs de fichiers (au moins 1, plus de 10). Les descripteurs de fichiers ne sont pas partagés entre les fils, donc je n'ai pas à vous soucier d'un thread secondaire bloquant l'autre quand select
ing pour voir ce qui est prêt à lecture / écriture. Ce que je veux être sûr que ni des fils secondaires entraîne le thread principal pour arrêter l'exécution pendant que l'appel select
/ pselect
est en cours d'exécution.
Je suppose que ce n'est pas un problème - on imaginer que de telles choses se faire, disons, un serveur web - mais je ne pouvais pas trouver quelque chose qui spécifiquement dit « oui, vous pouvez le faire » quand je googlé. Ai-je raison dans mon hypothèse que cela ne posera aucun problème?
Pour plus de précisions, ce que je ressemble à quelque chose comme:
-
fil principal d'exécution (boucle de
select()
la gestion des messages de commande entrantes et les réponses sortantes) -
filetage secondaire n ° 1 (boucle de
select()
fourniture d'un service) -
filetage secondaire # (boucle de
select()
fournir un autre service) 2
Comme je l'ai mentionné précédemment, aucun des descripteurs de fichiers sont partagés entre les fils -. Ils sont créés, utilisés et détruits dans un thread individuel, avec les autres fils ignorants de leur existence
La solution
Non, vous n'avez pas à vous soucier de les bloquer le thread principal. Je l'ai utilisé de choix dans plusieurs threads dans divers projets. Tant qu'ils ont fdsets distincts alors vous allez bien et chacun peut être utilisé comme une boucle d'événement indépendant.
Autres conseils
Select est pas censé bloquer tout le processus? Avez-vous essayé de régler le mode sans blocage sur la prise?
En outre, voir select_tut page de manuel d'aide.
Voici une section pertinente du select_tut
manpage:
So what is the point of select()? Can't I just read and write to my descriptors whenever I want? The point of select() is that it watches multiple descriptors at the same time and properly puts the process to sleep if there is no activity.