B>Если notify был вызван до wait'а, то нет никакой гарантии, что ожидающий поток будет когда-либо пробуждён.
гм... похоже это мой случай.
У меня дело в том что несколько рабочих потоков и у каждого свой cv.
И основной (менеджер) тоже со своей CV который менеджит их и готовит задания.
Задумка была в том что посредством notify_one на ожидающей CV менеджера, тот что выполняет задание сообщает менеджеру что он его выполнил и готов принять еще (а сам в этом время ждет на своей cv), а менеджер в свою очередь загружает новое задание и в его cv сообщает что пора начинать работу.
Вот куско кода рабочего потока:
do
{
notify_cb.fn_notify_ready(shared_from_this()); //<-- сообщаем менеджеру что готовы принять работу или выполнили ее
// <-- похоже тут менеджер успевает установить задачу и сообщить - выполняй
boost::unique_lock<boost::mutex> lock(m_mtx_data_ready); //<-- ждем пуша от менеджера
m_cv_data_ready.wait(lock, [this]() -> bool { return s_DataReady == m_state || s_Finalize == m_state; });
if (s_DataReady == m_state)
{
do_job();
m_state = s_DataProcessed;
}
} while (s_Finalize != m_state);