Re[2]: непонятки с condition variable
От: nen777w  
Дата: 04.07.16 19:29
Оценка:
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);
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.