Задача+о+читателях+и+писателях.

При разработке синхронизации и параллельных вычислений зачастую полезно связать имеющуюся у вас задачу с уже известными и получить возможность проверить применимость вашего решения к известной задаче. В литературе довольно часто встречается рассмотрение таких "эталонных" задач, представляющих собой примеры часто возникающих перед разработчиком проблем. С одной из них — задачей производителя/потребителя — мы уже встречались; в этом разделе мы рассмотрим еще одну классическую задачу — читателей/писателей. Определить ее можно следующим образом. Имеются данные, совместно используемые рядом процессов. Данные могут находиться в файле, в блоке основной памяти или даже в регистрах процессора. Имеется несколько процессов, которые только читают эти данные (читатели), и несколько других, которые только записывают данные (писатели). При этом должны удовлетворяться следующие условия. > только один писатель. > читать. Перед тем как приступить к работе, разделим эту задачу на две: обычную задачу взаимоисключений и задачу производителя/потребителя. В задаче читателей/писателей читатели не записывают данные, а писатели их не читают. Более общей является ситуация, когда каждый процесс может как читать, так и писать данные (и которая включает рассматриваемую задачу как частный случай). В таком случае мы можем объявить любую часть процесса, которая обращается к данным, критическим разделом и использовать простейшее решение на основе взаимоисключений. Причина, по которой мы рассматриваем частный случай более общей задачи, заключается в том, что общее решение значительно замедляет работу, в то время как для частного случая имеется гораздо более эффективное решение. Представим себе библиотечный каталог, в котором читатели могут искать нужную им литературу, а один или несколько работников библиотеки могут этот каталог обновлять. При общем решении читатели будут вынуждены входить в каталог по одному, что, конечно, приведет к неоправданным задержкам и очередям. Кроме того, работники библиотеки при внесении изменений не должны мешать друг другу, а также не должны допускать читателей к данным в момент их изменения, чтобы предотвратить получение читателем недостоверной информации. Можно ли рассматривать задачу производителя/потребителя как частный случай задачи читателей/писателей с единственным писателем (производитель) и единственным читателем (потребитель)? Оказывается, нет. Производитель — не просто писатель. Он должен считывать значение указателя очереди, чтобы определять, куда следует вносить очередную порцию информации, и выяснять, не заполнен ли буфер. Аналогично и потребитель является не просто читателем, так как он изменяет значение указателя очереди, указывая, что элемент удален из буфера.
 * Любое число читателей могут одновременно читать файл.
 * Записывать информацию в файл в определенный момент времени может
 * Когда писатель записывает данные в файл, ни один читатель не может его

@http://life-prog.ru/view_os.php?id=54