Введение

В информатике, задачи читателей-писателей являются примерами распространенной вычислительной проблемы, связанной с конкурентным доступом. Существует как минимум три варианта этих задач, которые рассматривают ситуации, когда множество параллельных потоков выполнения пытаются одновременно получить доступ к одному и тому же общему ресурсу. Некоторые потоки могут читать, а другие – записывать, при этом действует ограничение, что ни один поток не должен получать доступ к общему ресурсу для чтения или записи, пока другой поток выполняет запись. (В частности, необходимо предотвратить одновременное изменение общего ресурса несколькими потоками и разрешить одновременный доступ к общему ресурсу двум или более читающим потокам). Блокировка читателей-писателей – это структура данных, которая решает одну или несколько задач читателей-писателей. Базовая задача читателей-писателей была впервые сформулирована и решена Куртуа и соавторами.

Простейшая проблема читателя-писателя

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

Алгоритм

Читатель будет ожидать писателя из-за семафора чтения. Писатель прекратит запись, когда семафор записи достигнет 0. Читатель прекратит чтение, когда семафор чтения достигнет 0. В процессе записи значение семафора записи передается семафору чтения, а в процессе чтения значение семафора чтения передается семафору записи по завершении цикла.