Я не верю, что вы можете сделать что-нибудь подобное с boost :: thread. Возможно, потому что переменные условия POSIX не допускают этот тип конструкции. Конечно, в Windows есть WaitForMultipleObjects в виде сообщения J, что может быть решением, если вы захотите ограничить свой код примитивами синхронизации Windows.
Другой вариант - использовать меньше условных переменных: просто есть 1 условная переменная, которую вы запускаете, когда происходит что-то «интересное». Затем в любое время, когда вы захотите подождать, вы запускаете цикл, который проверяет, возникла ли ваша конкретная интересующая вас ситуация, и если нет, переходите к ожиданию переменной условия. В любом случае вы должны ожидать этих условных переменных в таком цикле, так как ожидания условных переменных подвержены ложным пробуждениям (из boost :: thread docs, выделение мое):
void wait(boost::unique_lock<boost::mutex>& lock)
...
Эффекты:
Атомно вызывает lock.unlock()
и блокирует текущий поток. Поток будет разблокирован, когда получит уведомление по вызову this->notify_one()
или this->notify_all()
, или spierious . ...