d'attente pour de multiples variables de condition de suralimentation?
Je suis à la recherche d'un moyen d'attendre pour de multiples variables de condition.
c'est à dire. quelque chose comme:
boost::condition_variable cond1;
boost::condition_variable cond2;
void wait_for_data_to_process()
{
boost::unique_lock<boost::mutex> lock(mut);
wait_any(lock, cond1, cond2); //boost only provides cond1.wait(lock);
process_data();
}
Est quelque chose comme cela possible avec les variables de condition. Et si non existe t il d'autres solutions?
Grâce
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas que vous pouvez faire quelque chose comme ça avec boost::thread. Peut-être parce que POSIX variables de condition, de ne pas autoriser ce type de construction. Bien sûr, Windows a WaitForMultipleObjects comme aJ posté, ce qui pourrait être une solution si vous êtes prêt à limiter votre code pour Windows primitives de synchronisation.
Une autre option serait d'utiliser moins de variables de condition: avoir juste 1 de la variable de condition que vous le feu, quand quelque chose "d'intéressant" arrive. Ensuite, chaque fois que vous voulez attendre, vous exécutez une boucle qui vérifie si votre situation particulière de l'intérêt a venir, et si non, retournez à l'attente sur la variable de condition. Vous devriez être en attente sur ces variables de condition dans une boucle de ce genre de toute façon, en tant que variable de condition les temps d'attente sont soumis à des parasites de réveils (à partir de boost::thread docs, c'est moi qui souligne):
void wait(boost::unique_lock<boost::mutex>& lock)
...
Effets:
Atomiquement appel
lock.unlock()
et bloque le thread courant. Le fil se débloquer lorsque informé par un appel àthis->notify_one()
outhis->notify_all()
, ou erreur. ...GoStyleChannel::receive_but_break_if(condition_variable& cv, function& pred)
. En d'autres termes, supposons que vous avez un certain blocage de la fonction qui utilise une variable de condition. Vous souhaitez bloquer jusqu'à ce que la condition qui se produit ou votre condition se produit. Vous ne pouvez pas le faire sans avoir un mondialstd::condition_variable somethingHasHappenedSomewhere
, qui est vraiment de la merde.Comme Managu déjà répondu, vous pouvez utiliser la même variable de condition et de vérifier plusieurs "événements" (bool variables) dans ta boucle while. Toutefois, l'accès simultané à ces bool variables doivent être protégées à l'aide de la même mutex que le condvar utilise.
Depuis que je suis déjà passé par la peine de taper ce code exemple pour une question, je vais reposter ici:
Je ne suis pas sûr de la bibliothèque Boost, mais vous pouvez utiliser WaitForMultipleObjects Fonction d'attendre plusieurs objets du noyau. Il suffit de vérifier si cela aide.
Comme Managu points à l'aide de plusieurs conditions peuvent ne pas être une bonne solution en premier lieu. Ce que vous voulez faire devrait être possible pour être mis en œuvre à l'aide de Sémaphores.
En utilisant la même variable de condition pour plusieurs événements techniquement fonctionne, mais il ne permet pas d'encapsulation. J'ai donc eu une tentative de faire une classe qui prend en charge. Pas encore testé! Aussi, il ne prend pas en charge
notify_one()
que je n'ai pas travaillé sur la façon de l'appliquer.