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


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


К последнему методу (Done) программа обращается, закончив работу с этим ресурсом. Куда уж проще, а?

Объект CSWMRG содержит набор переменных-членов (см. таблицу ниже), отражающих то, как потоки работают с разделяемым ресурсом на данный момент. Остальные подробности Вы узнаете из исходного кода.

Переменная

Описание

m_cs

Охраняет доступ к остальным членам класса, обеспечивая опера ции с ними на атомарном уровне

т_nActive

Отражает текущее состояние разделяемого ресурса. Если она равна 0, ни один поток к ресурсу не обращается. Ее значение, большее 0, со общает текущее число потоков, считывающих данные из ресурса. Отрицательное значение (-1) свидетельствует о том, что какой-то поток записывает данные в ресурс.

m_nWaitingReaders

Сообщает количество потоков "читателей", которым нужен доступ к ресурсу. Значение этой переменной инициализируется 0 и увели чивается на 1 всякий раз, когда поток вызывает WaitToRead в то вре мя, как т nActive равна — 1.

т_nWaitingWriters

Сообщает количество потоков-"писателей", которым нужен доступ к ресурсу. Значение этой переменной инициализируется 0 и увели чивается на 1 всякий раз, когда поток вызывает WaitToWrite в то вре мя, как т nActive больше 0,

т_hsemWriters

Когда потоки-"писатели"> вызывают WaitToWrtie, но получают отказ в доступе, так как m_nActive больше 0, они переходят в состояние ожидания этого семафора. Пока ждет хотя бы один поток-"писатель", новые потоки-"читатели" получают отказ в доступе к ресурсу. Тем самым я не даю потокам-"читателям" монополизировать доступ к этому ресурсу. Когда последний поток-"читатель", работавший с ресурсом, вызывает Done, семафор освобождается со счетчиком, равным 1, и система пробуждает один ждущий поток-"писатель".

m_hsemReaders

Когда потоки-"читатели" вызывают WaitToRead, но получают отказ в доступе, так как m_nActive равна - 1, они переходят в состояние ожидания этого семафора. Когда последний из ждущих потоков-"писателей" вызывает Done, семафор освобождается со счетчиком, равным m_nWaitingReaders, и система пробуждает все ждущие потоки-"читатели".




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



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