Зачем форсировать 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
? Если удалить эту строку, что произойдет?