зачем форсировать shared_mutex unlock_shared для установки в state.upgrade значения false в последнем читателе? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь разобраться в исходном коде 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? Если удалить эту строку, что произойдет?

...