Читатель - писатель мьютексов - PullRequest
1 голос
/ 22 февраля 2010

Это проблема читателя-писателя только для согласованности чтения.Вот алгоритм:

void reader() {
    while (1) {
        P(mutex); 
        rc++;
        if (rc == 1) P(db); /* <---- A */
        V(mutex); /* <---- B */
        read_data_base();
        P(mutex);
        rc--; 
        V(mutex);
        if (rc == 0) V(db);
    }
}

void writer() {
    while (1) {
        P(db); 
        write_data_base();
        V(db);
    }
}

Вот мои вопросы: 1. Какова цель строки A в коде считывателя?2. Если мы удалим эту строку, будет ли код по-прежнему работать правильно?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2010
  • Цель строки A - проверить, является ли текущий читатель первым после записи (или первым в целом). Если это так, то он должен получить мьютекс базы данных (дБ), чтобы ни один писатель не мог записать в базу данных, хотя ее читает хотя бы один читатель.

    Соответствующая строка для последнего читателя:

    if (rc == 0) V(db);

    Цель этой строки - проверить, является ли текущий читатель последним, чтобы писатель мог войти следующим (если нет другого читателя, который входит перед писателем).

  • На основании приведенного выше описания, если вы исключите строку A, ваш код будет работать некорректно.

Примечание : Как видно из ответа Влада ниже (и обсуждения в комментариях к нему), V(mutex) должно быть после if (rc == 0) V(db).

1 голос
/ 22 февраля 2010

Прежде всего, код неправильный: вам нужно выполнить if (rc ==0) V(db) под заблокированным mutex.

Строка A необходима для блокировки базы данных для чтения. Блокировка устанавливается при первой операции чтения и снимается после последней; а также он устанавливается во время каждой из возможных операций записи. Если блокировка не будет установлена, операции чтения и записи могут выполняться одновременно, что приведет к повреждению данных.

0 голосов
/ 22 февраля 2010

Автор не должен писать, пока кто-то читает. Поэтому любой читатель блокирует БД во время чтения, если он ранняя пташка (# 1). И он должен убрать блокаду, если он последний парень в комнате (rc == 0).

...