Зачем форсировать shared_mutex unlock_shared, чтобы установить в state.upgrade значение false в последнем читателе?

Я пытаюсь понять исходный код Boost shared_mutex, но застрял в unlock_shared() метод.

Следующая копия кода из boost1.68, строка 241 ~ 264:

void unlock_shared()
{
    boost::unique_lock<boost::mutex> lk(state_change);
    state.assert_lock_shared();
    state.unlock_shared();
    if (state.no_shared())
    {
        if (state.upgrade)
        {
            // As there is a thread doing a unlock_upgrade_and_lock that is waiting for state.no_shared()
            // avoid other threads to lock, lock_upgrade or lock_shared, so only this thread is notified.
            state.upgrade=false;
            state.exclusive=true;
            //lk.unlock();
            upgrade_cond.notify_one();
        }
        else
        {
            state.exclusive_waiting_blocked=false;
            //lk.unlock();
        }
        release_waiters();
    }
}

Когда последний читатель unlock_shared обновляет блокировку обновления, он установит state.upgrade в false а также state.exclusive в true затем уведомить upgrade_cond,

Я понимаю, что набор state.exclusive в true можно избежать других тем lock, lock_upgrade или же lock_shared,

Но зачем устанавливать state.upgrade в false? Если удалить эту строку, что произойдет?

0 ответов

Другие вопросы по тегам