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


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


А теперь вопрос: как ее решить?

NOTE:
Я представлю здесь совершенно новый код. Решения этой проблемы, которые я публиковал в прежних изданиях, часто критиковались по двум причинам. Во первых, предыдущие реализации работали слишком медленно, так как я писал их в расчете на самые разные сценарии. Например, я шире использовал объекты ядра, стремясь синхронизировать доступ к базе данных потоков из разных процессов. Конечно, эти реализации работали и в сценарии для одного процесса, но интенсивное использование объектов ядра приводило в этом случае к существенным издержкам. Похоже, сценарий для одного процесса более распространен, чем я думал.

Во-вторых, в моей реализации был потенциальный риск блокировки noтоков-"писателей". Из правил, о которых я рассказал в начале этого раздела, вытекает, что потоки-"писатели" — при обращении к базе данных очень большого количества потоков-"читателей" — могут вообще не получить доступ к этому ресурсу.

Все эти недостатки я теперь устранил. В новой реализации объекты ядра применяются лишь в тсх случаях, когда без них не обойтись, и потоки синхронизируются в основном за счет использования критической секции.

Плоды своих трудов я инкапсулировал в С++-класс CSWMRG (я произношу его название как swimerge); это аббревиатура от "single writer/multiple reader guard". Он содержится в фцйлах SWMRG.h и SWMRG.cpp (см. листинг на рис. 10-3).

Использовать CSWMRG проще простого. Вы создаете объект С++-класса CSWMRG и вызываете нужные в Вашей программе функции-члены. В этом классе всего три метода (не считая конструктора и деструктора):

VOID CSWMRG:;WaitToRead(); // доступ к разделяемому ресурсу для чтения

VOID CSWMRG::WaitToWrite(); // монопольный доступ к разделяемому ресурсу для записи

VOID CSWMRG::Done(); // вызывается по окончании работы с ресурсом

Первый метод (WaitToRead) вызывается перед выполнением кода, что-либо считывающего из разделяемого ресурса, а второй (WaitToWrite) - перед выполнением кода, который считывает и записывает данные в разделяемом ресурсе.


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



Книжный магазин