Пример Reader-Writer Synchronization Technology
Обновлен: Ноябрь 2007
В этом примере демонстрируется использование класса синхронизации потоков ReaderWriterLock. Функциональность типа ReaderWriterLock позволяет разработчикам создавать код, предоставляющий монопольный доступ к ресурсам для потока в то время, как этот поток создает или изменяет ресурсы, но когда поток выполняет чтение или запрос ресурсов, ему предоставляется только немонопольный доступ.
Дополнительные сведения об использовании примеров см. в следующих разделах:
Построение примера с использованием командной строки
Откройте окно командной строки и перейдите к вложенной папке для данного примера, соответствующей выбранному языку.
В командной строке введите msbuild ReaderWriterSynchronizationCS.sln или msbuild ReaderWriterSynchronizationVB.sln, в зависимости от выбранного языка программирования.
Построение примера с использованием Visual Studio
Откройте обозреватель Windows и перейдите к вложенной папке для данного примера, соответствующей выбранному языку.
Дважды щелкните значок ReaderWriterSynchronizationCS.sln или ReaderWriterSynchronizationVB.sln, в зависимости от выбранного языка программирования, чтобы открыть файл в Visual Studio.
В меню Построение выберите команду Построить решение.
Выполнение примера
Перейдите в каталог, содержащий новый исполняемый файл.
В командной строке введите ReaderWriter.exe.
Примечание. В данном образце выполняется построение консольного приложения. Чтобы просмотреть выводимые им данные, необходимо запустить его в командной строке. Во время выполнения примера заметьте, что вывод Пуск записи и Остановить запись для каждого модуля записи возникает непрерывно. Причина заключается в том, что модуль записи удерживает монопольный доступ к ресурсу, а не к модулям чтения.
Примечания
Дополнительные сведения о синхронизации потоков и монопольном доступе см. в комментариях в исходном коде и файлах build.proj.
В следующем маркированном списке кратко описываются технологии и классы, используемые в этом примере.
- Синхронизация потоков
ReaderWriterLockИспользуется для защиты логического ресурса, который реализуется как вызов Sleep. Потоки, использующие тип ReaderWriterLock, могут удерживать блокировку двумя способами. Во-первых, поток может удерживать блокировку чтения, которая получает немонопольный доступ и позволяет другим потокам получать блокировку чтения для класса. Во-вторых, поток может запрашивать блокировку записи, которая получает монопольный доступ и не получает доступа до выпуска текущего удержания блокировки чтения и записи.
AutoResetEvent Главный поток в примере ожидает объект AutoResetEvent до тех пор, пока он не будет задан. Объект показывает, что последние асинхронные функции завершают свою работу.
InterlockedВ примере используются статические методы Interlocked.Increment и Interlocked.Decrement для получения асинхронного доступа к переменной счетчика, чтобы показать, когда значение AutoResetEvent должно быть задано.
Работа с потоками
- ThreadPool При записи управляющего кода разработчикам рекомендуется использовать метод QueueUserWorkItem для внедрения асинхронных вызовов методов. В этом примере используется подход к выполнению кода, который вступает в конфликт с логическим ресурсом.
Делегаты
- WaitCallback Используется для создания безопасного метода обратного вызова для используемого класса ThreadPool.