boost :: condition_variable.timed_wait немедленно возвращает - PullRequest
1 голос
/ 29 июля 2011

Я работаю над небольшой библиотекой потоков и столкнулся с проблемой.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;
}

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

waitCondition.notify_all();

1 Ответ

4 голосов
/ 29 июля 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...