sélection simultanée à partir d’un canal nommé

Disons que j’ai un fifo (pipe nommée) qui s’ouvre plusieurs fois à partir de plusieurs processus ou threads. Tous vont appeler select () pour lire simultanément. Si un écrivain entre et écrit, disons un octet à ce fifo, tous les appels select () bloqués seront-ils renvoyés simultanément ou un seul thread sera-t-il choisi et retourné par select ()?

Y at-il une spécification à ce sujet ou cela dépendrait du système?

La raison pour laquelle je demande cela est que je veux implémenter des événements de réinitialisation manuelle de type Windows en utilisant fifos. L’événement de réinitialisation manuelle exige que, lorsque l’événement est signalé, tous les threads en attente soient libérés (pas un seul pour l’événement de réinitialisation automatique).

Je pourrais utiliser pthread conds pour cela, mais mon exigence est que les événements soient partagés par plusieurs processus.

Merci.

Si un écrivain entre et écrit, disons un octet à ce fifo, tous les appels select () bloqués seront-ils renvoyés simultanément ou un seul thread sera-t-il choisi et retourné par select ()?

Il y aura une condition de course. Le système commencera à réveiller les threads dans un ordre aléatoire jusqu’à ce que l’un d’entre eux lise les données, vide le tampon et empêche les autres threads de se réveiller.

Y at-il une spécification à ce sujet ou cela dépendrait du système?

Cela dépendra du système, de la disposition de l’application, de la structure du code. Ce sera un grand comportement indéfini.

La raison pour laquelle je demande cela est que je veux implémenter des événements de réinitialisation manuelle de type Windows en utilisant fifos.

Codez-vous sur Linux / Posix? Utilisez la fonction tee au lieu de read, faites en sorte que les threads écrivent un code d’état dans le tube pour signaler qu’ils se sont réveillés. Ensuite, réinitialisez le canal en lisant les données dans le thread de contrôle.

C’est-à-dire:

Dans les threads de travail: select (et block). Dans le thread de contrôle: écrivez un octet. Maintenant, la sélection ne bloque pas. Les fils de travail se réveillent. Maintenant, faites un tee optionnel (un octet) dans les threads de travail et réécrivez un octet dans le tube de chaque thread. Dans le thread de contrôle: lire et compter les octets. Si toute l’onde de fil de travail se réveille, faites une lecture d’octet supplémentaire pour effacer le premier octet que vous avez écrit. La sélection se bloque à nouveau.

Notez que vous ne pouvez pas entrer de nouveau la sélection avant d’avoir terminé toute la procédure. Vous pourriez avoir besoin de deux tels tuyaux.