Я использую условные переменные для периодического уведомления неизвестного количества потоков. то есть al oop будет периодически изменять значение и затем уведомлять все потоки, ожидающие переменную. Обычный способ избежать ложных пробуждений - использовать логическую переменную.
Поток, ожидающий переменную после пробуждения, устанавливает значение bool
равным false
class foo
{
std::mutex mtx;
std::condition_variable cv;
bool update;
public:
void loop()
{
std::this_thread::seep_for(std::chrono::milliseconds(100));
{
std::lock_guard<std::mutex> lock(mtx);
update = true;
}
cv.notify_all();
}
void wait()
{
while(!update)
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait();
if(update)
{
update = false;
break;
}
}
}
};
Функция foo::loop
запускается в потоке, и другие потоки, выполняющие процедуры periodi c, будут ожидать через функцию foo::wait
.
Но поскольку разные потоки могут начинать ожидать в разное время может показаться, что каждому потоку потребовалась бы специальная логическая переменная, чтобы гарантировать отсутствие ложных пробуждений.
Поскольку я не знаю, сколько потоков может ожидать его, я не могу использовать массивы bool или что-то еще.
Так есть ли другой способ, кроме использования std::map<std::thread::id,bool>
для отслеживания всех обновлений.