Увеличьте shared_mutex с помощью условных авторов - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь написать класс, который разрешает доступ к данным нескольким читателям или только одному писателю. Проблема заключается в том, что читатель может условно стать писателем, и я хочу убедиться, что независимо от того, сколько потоков хочет быть писателем, разрешается быть только одному, а другие потоки ждут завершения писателя и переходят обратно в читатели.

Проблема в операторе if(condition), так как это может быть оценено как истинное несколькими потоками, что заставляет их всех пытаться стать записывающими, даже если данные нужно записать только один раз.

class Test {
public:
    int getData() {
        boost::shared_lock<boost::shared_mutex> lock(access_);

        if(condition) {
            writeData();
        }

        // Do stuff
    }

    void writeData() {
        // Get exclusive access
        boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(access_);

        // Do stuff
    }

private:    
    boost::shared_mutex access_;
}

1 Ответ

1 голос
/ 09 февраля 2012

Итак, я понял, что это работает приемлемым образом.По сути, я снимаю разделяемую блокировку, если необходима запись, и тогда функция записи получит уникальную блокировку.Получив уникальную блокировку в функции записи, он снова проверяет, чтобы убедиться, что операция записи по-прежнему необходима для обработки случая, когда несколько потоков считают, что им нужно записать данные.

Я знаю, что это не так.Идеально, так как время ожидания уникальной блокировки в нескольких потоках, когда уникальная блокировка нужна только одному потоку.Но на данный момент производительность достаточно хорошая, и это значительное улучшение по сравнению с тем, что было раньше.

class Test {
public:
    int getData() {
        boost::shared_lock<boost::shared_mutex> lock(access_);

        if(need_write) {
            lock.unlock();
            writeData();
            lock.lock();
        }

        // Do stuff
    }

    void writeData() {
        // Get exclusive access
        boost::unique_lock<boost::shared_mutex> unique_lock(access_);

        if(need_write) {
            return;
        }

        // Do stuff
    }
private:    
    boost::shared_mutex access_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...