Attendre sur de multiples variables de condition sur Linux sans inutiles dort-il?

Je suis en train d'écrire une latence sensible application qui, en effet, veut attendre sur de multiples variables de condition à la fois. Je l'ai lu avant de plusieurs moyens pour obtenir cette fonctionnalité sur Linux (apparemment c'est builtin sur Windows), mais aucune d'entre elles semblent convenir pour mon application. Les méthodes que je connais sont:

  1. Ont un thread attente sur chacune des variables de condition, vous voulez attendre, qui, lorsqu'il sera réveillé signal d'une seule variable d'état qui vous attendent sur place.

  2. Vélo à travers de multiples variables de condition, avec un temps d'attente.

  3. Écrit mannequin octets de fichiers ou des tubes à la place, et l'interrogation sur ceux-ci.

#1 & #2 sont inadaptées, car elles entraînent inutile de couchage. Avec le n ° 1, vous avez à attendre pour le mannequin thread à se réveiller, alors le signal de véritable fil conducteur, puis pour le véritable fil conducteur de se réveiller, au lieu de la véritable fil conducteur juste de me réveiller pour commencer, l'extra planificateur de quantum passé sur ce qui importe réellement pour mon application, et je préfèrerais ne pas avoir à l'utiliser à part entière un RTOS. #2 est encore pire, vous passent potentiellement N * délai d'attente temps à dormir, ou votre délai d'attente sera 0 dans ce cas, vous ne dormez jamais (à l'infini la gravure du PROCESSEUR et de la faim d'autres threads est aussi mauvais).

Pour le #3, les tuyaux sont problématiques parce que si le thread " a " est occupé ou même se bloque (je suis en affaire avec processus distinct plutôt que de threads -- les mutex et les conditions devraient être stockées dans la mémoire partagée), alors le thread d'écriture sera coincé à cause de la canalisation de la mémoire tampon est pleine, comme tous les autres clients. Les fichiers sont problématiques parce que vous seriez la croissance sans cesse plus l'application a couru.

Est-il une meilleure façon de le faire? Curieux pour des réponses appropriées pour Solaris ainsi.

  • Je rencontre cette limitation dans le C++0x primitives de thread qui semblent être fortement basé sur un pthreads moins-petit dénominateur commun.
  • Ne pouvez-vous pas utiliser un seul sémaphore à la place? Une fois que le thread en attente obtient une unité, il peut interroger les différentes sources pour en trouver un qui a des "la flamme", (peut-être un tableau de la volatilité des booléens?).