Привет!
Есть два потока: первый наполняет буфер (на самом деле буфера два, один наполняется, второй обрабатывается, потом меняются) данными из сети, второй ждёт данные в бесконечном цикле и должен их обрабатывать, как буфер заполнился, а остальное время спать.
Второй может работать дольше первого, соответственно пропустить несколько наполнений. Данные, которые второй поток обработать не успел, нужно отбрасывать.
Сейчас для синхронизации используется std::condition_variable, прямо в виде из примера: https://en.cppreference.com/w/cpp/thread/condition_variable
Проблема в том, что, если второй поток работал слишком долго и пропустил несколько циклов заполнения, то первый поток уже установил переменную, используемую в предикате, в состояние true и вызвал (один или несколько раз) notify_one().
И «cv.wait(lk, []{return ready;});», насколько я понимаю, снимает блокировку сразу, не дожидаясь нового события (новых данных). Второй поток при этом начинает обрабатывать старые данные. Мне это не нужно. Нужно, чтобы он ждал свежие, а те, что не успел обработать, просто отбрасывались бы.
Можно было бы использовать «cv.wait(lk);», т.е. без предиката. Тогда, насколько я понимаю, notify_one() вызванный до wait() будет проигнорирован, а сработает тот notify_one(), что вызывался уже после wait(). Что мне и нужно. Но везде пишут, что без предиката может произойти некое состояние «spurious wakeup» (ложное пробуждение), когда никто не делал notify_one() или notify_all(), а wait() вернул управление и поток-обработчик проснулся просто так.
Как такая задача правильно решается?
Каким чудом эти spurious wakeup вообще случаются?
Ответ на:
комментарий
от seryoga
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от seryoga
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от ls-h
Ответ на:
комментарий
от ls-h
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум условные переменные (2018)
- Форум Синхронизация потоков (2012)
- Форум Синхронизация потоков (2009)
- Форум condition_variable + timed_mutex (2014)
- Форум простейшая синхронизация потоков (2012)
- Форум condition_variable без мьютекса (2020)
- Форум синхронизация потоков ( ламер-программер ) (2001)
- Форум Как отследить вталкивание std::endl в поток? (2016)
- Форум Синхронизация потоков с помощью семафоров (2013)
- Форум Синхронизация глобальных переменных в потоках (2009)