boost::condition_variable.timed_wait немедленно возвращает

Я работаю над небольшой библиотекой потоков и столкнулся с проблемой. boost::condition_variable.wait() работает отлично, однако boost::condition_variable.timed_wait() возвращается немедленно, время не истекает.

В документации сказано, что он должен возвращаться только после истечения времени ожидания или уведомления. Это три секунды ожидания до уведомления, и я попробовал тайм-ауты 10 и 100 секунд, поэтому он должен вернуться через 3 секунды.

РЕДАКТИРОВАТЬ:

boost::condition_variable waitCondition;
boost::mutex mMutex;

Message MessageClient::waitAsync(Message msg, bool waitForReply) {
   unique_lock<boost::mutex> lock(msg->mMutex);
   if(mSendTimeout.sec == 0)
       msg->waitCondition.wait(lock);
   else {
       timeout = msg->waitCondition.timed_wait(lock,  mSendTimeout);
       if(!timeout)
           return 0;

       if(waitForReply) {
          Message reply = receiveMessage();
          return reply;
       }
       else
          return 0;
}

Это вызывается после sendMessage. Получатель получает сообщение, отправляет ответ и затем звонит

waitCondition.notify_all();

1 ответ

Решение

Ожидания переменной условия могут иногда приводить к ложным пробуждениям. Таким образом, вы должны использовать их в цикле:

while (someCondition)
  msg->waitCondition.wait(lock);

С timed_wait это немного сложнее, так как вы должны пересчитать время ожидания, чтобы справиться с тем, сколько времени он фактически ждал. Boost предлагает вариант с предикатом, который при абсолютном таймауте сделает цикл за вас:

msg->waitCondition.timed_wait(lock, absoluteTimeout, boost::lambda::var(someFlag));

Если у вас все еще есть проблемы, проверьте это mSendTimeout не является отрицательным или очень маленьким, и рассмотрите использование абсолютного тайм-аута.

Другие вопросы по тегам