Ответ здесь почти делает то, что я хочу.
Я хочу блокировку чтения и записи, которая будет:
Вышеприведенная реализация не соответствует критериям (2). Это позволяет новым читателям захватывать блокировку и блокировать писателя до тех пор, пока они не будут закончены.
Найди его. Мне нужен unique_lock
вместо upgrade_to_unique_lock
:
boost::shared_mutex _access;
void reader()
{
// get shared access
boost::shared_lock<boost::shared_mutex> lock(_access);
}
void writer()
{
// wait for old shared access readers to finish
// but block out new shared access readers
boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
}
Но здесь ваш метод "писатель" не имеет атрибута "lock". Вы имеете в виду, что перед "unique_lock" вам все равно нужно сделать "upgrade_lock"? Что-то вроде:
void writer()
{
// get upgradable access
boost::upgrade_lock<boost::shared_mutex> lock(_access);
// get exclusive access
boost::unique_lock<boost::shared_mutex> uniqueLock(lock);
// now we have exclusive access
}
Или вы смешивали атрибуты, и это должно быть:
void writer()
{
boost::unique_lock<boost::shared_mutex> uniqueLock(_access);
// now we have exclusive access
}