@simply_user

Почему поток не блокируется и продолжает работать, хотя сигнал не был получен?

Здравствуйте!
Пишу программу для обработки текста из файла. Код построен по принципу "поставщик-потребитель". Для блокирования потребителя использую condition_variable. При использовании первой перегрузки метода wait (без предиката) всё работает нормально. Но, если использовать вторую перегрузку, с предикатом, то получается вот такая ситуация: поставщику достаточно отправить хотя бы один сигнал, чтобы ожидающий поток потребителя разблокировался и больше он уже не блокируется, даже если сигнал не был больше послан. Хочу обратить внимание, что данное поведение имеет место быть только при использовании предиката (я в лямбда-выражении проверяю, что очередь не пуста). Почему так происходит?
Заранее спасибо!
Код:
unique_lock<mutex> lockM(signalMutex);
				conVar.wait(lockM, []{return !Producer::dataProcessing.empty(); });
				buffer = Producer::dataProcessing.front();
				Producer::dataProcessing.pop();
				lockM.unlock();
  • Вопрос задан
  • 2343 просмотра
Решения вопроса 1
@DISaccount
Очевидно, что условие return !Producer::dataProcessing.empty(); все время возвращает true.
Читаем внимательно:
If pred is specified (2), the function only blocks if pred returns false, and notifications can only unblock the thread when it becomes true
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы