Attente sur plusieurs sémaphores sans attente en attente (C / C ++ Linux)

Si j’ai plusieurs sémaphores, comment puis-je avoir un bloc de processus jusqu’à ce qu’au moins un des sémaphores soit libre? Je sais que je peux le faire avec une boucle d’attente chargée telle que:

// blocks until one of the semaphores in sems is free, returns // index of semaphore that was available int multiple_sem_wait(sem_t **sems, int num_sems) { while (true) { for (int i = 0; i < num_sems; ++i) { if (sem_trywait(sems[i]) == 0) { return i; } } } } 

Mais y a-t-il un moyen de faire cela sans une boucle occupée? Peut-être qu’il y a une technique IPC autre que des sémaphores que je devrais utiliser?

Merci

Here (developers.sun.com) WaitForMultipleObjects comment Sun a implémenté son émulation WaitForMultipleObjects dans Solaris. L’idée de base est d’associer une liste de variables de condition à un descripteur (protégé par un mutex) et de signaler toutes les variables de condition chaque fois que le descripteur est signalé. Chaque fois que vous appelez WaitForMultipleObjects émulé, une nouvelle variable de condition est créée et ajoutée à la liste de tous les WaitForMultipleObjects vous intéressent. Dans l’émulation WaitForMultipleObjects , vous bloquez la variable de condition et vérifiez chacun de vos descripteurs lorsque vous vous réveillez.

La raison pour laquelle il existe une liste de variables de condition (et pas une seule) est que deux threads peuvent être bloqués sur les handles: le thread 1 est bloqué sur A et B, et le thread 2 est bloqué sur A et C. La signalisation B doit ne pas réveiller le thread 2. Comme chaque appel à WaitForMultipleObjects crée une nouvelle variable de condition, dans ce scénario, B et C auront une variable de condition distincte et A aura les deux variables de condition.

Pour plus d’informations, vous devez lire l’article lui-même.

Utilisez plusieurs threads de serveur distincts, comme dans:

  • Chaque thread attend un sémaphore séparé.
  • Lorsqu’il attend avec succès sur le sémaphore, tout fil de serveur donné signale (via un autre sémaphore, une variable de condition ou la primitive la plus pratique) le fil qui veut “attendre sur plusieurs sémaphores”.