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