Блокировка нескольких читателей, блокировка одного записывающего устройства в блоке Boost WITH Writer

0

Ответ здесь почти делает то, что я хочу.

Я хочу блокировку чтения и записи, которая будет:

  1. Разрешить читателям делать блокировку до тех пор, пока нет записи
  2. Если автор пытается заблокировать, заблокируйте новых читателей от его взятия, но разрешите старым читателям закончить, прежде чем дать писателю блокировку
  3. Когда автор выпустит блокировку, разрешите новым читателям

Вышеприведенная реализация не соответствует критериям (2). Это позволяет новым читателям захватывать блокировку и блокировать писателя до тех пор, пока они не будут закончены.

  • 0
    А как насчет существующих читателей, когда писатель берет замок?
  • 0
    Они держат это. Как сказано в (2), он должен блокировать только новых читателей.
Показать ещё 5 комментариев
Теги:
multithreading
boost
mutex

2 ответа

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);
}
0

Но здесь ваш метод "писатель" не имеет атрибута "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
}
  • 0
    Благодарю. Я сделал редактирование.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню