Это проблема чтения-записи для простой согласованности чтения. Вот алгоритм:Чтение - мьютексы писателя
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. Какова цель линии А в коде чтения? 2. Если мы устраним эту строку, код будет работать правильно?
Вы уверены, что код не правильный? Можете ли вы привести пример, где произошла ошибка? – 3lectrologos
Я также думаю, что это неправильно .. thread 1: // Предположим, rc == 0 V (мьютексы); переключатель в резьбу 2: P (мьютексы); rC++; // now rc == 1 переключатель в нить 1: if (rc == 0) V (db); // rc уже 1, поэтому он забывает V (db). – stmax
Конечно. Представьте, что читатель № 1 входит в поток # 1 и выполняет до строки 'if (rc == 0) V (db);' (но не включая его). Теперь контекст переключается на поток # 2. В потоке # 2 приходит другой читатель, блокирует мьютекс, увеличивает «rc», теперь значение «rc» равно 2. Поэтому второй считыватель не блокирует 'db'. Теперь контекст переключается на поток # 3, в этом потоке автор пытается заблокировать db, получает блокировку и изменяет данные, которые в настоящее время считываются потоком # 2. Таким образом, данные будут повреждены. – Vlad