Windows для профессионалов


Синхронизация в сценарии "один писатель/группа читателей"


Во многих приложениях возникает одна и та же проблемя синхронизации, о которой часто говорят как о сценарии "один писатель/группа читателей" (single-wrirer/ multiple-readers). В чем ее суть? Представьте: произвольное число потоков пытается получить доступ к некоему разделяемому ресурсу. Каким-то потокам ("писателям") нужно модифицировать данные, а каким-то ("читателям") — лишь прочесть эти данные. Синхронизация такого процесса необходима хотя бы потому, что Вы должны соблюдать следующие правила:

  1. Когда один поток что-то пишет в область общих данных, другие этого делать не могут.
  2. Когда один поток что-то пишет в область общих данных, другие не могут ни чего считывать оттуда.
  3. Когда один поток считывает что-то из области общих данных, другие не могут туда ничего записывать.
  4. Когда один поток считывает что-тo из области общих данных, другие тоже могут это делать.

Посмотрим на проблему в контексте базы данных. Допустим, с ней работают пять конечных пользователей: двое вводят в нее записи, трое — считывают.

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

Правило 2 запрещает доступ к записи, обновляемой в данный момент другим пользователем. Будь то иначе, один пользователь считывал бы запись, когда другой пользователь изменял бы ее содержимое. Что увидел бы на мониторе своего компьютера первый пользователь, предсказать не берусь. Правило 3 служит тем же целям, что и правило 2. И действительно, какая разница, кто первый получит доступ к данным: тот, кто записывает, или тот, кто считывает, — все равно одновременно этого делать нельзя.

И, наконец, последнее правило. Оно введено для большей эффективности работы баз данных. Если никто не модифицирует записи в базе данных, все пользователи могут свободно читать любые записи. Также предполагается, что количество "читателей" превышает число "писателей".

О'кэй, суть проблемы Вы ухватили.


Начало  Назад  Вперед