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
не является отрицательным или очень маленьким, и рассмотрите использование абсолютного тайм-аута.