Поделиться через


Пример Reader-Writer Synchronization Technology

Обновлен: Ноябрь 2007

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

Дополнительные сведения об использовании примеров см. в следующих разделах:

Download sample

Построение примера с использованием командной строки

  1. Откройте окно командной строки и перейдите к вложенной папке для данного примера, соответствующей выбранному языку.

  2. В командной строке введите msbuild ReaderWriterSynchronizationCS.sln или msbuild ReaderWriterSynchronizationVB.sln, в зависимости от выбранного языка программирования.

Построение примера с использованием Visual Studio

  1. Откройте обозреватель Windows и перейдите к вложенной папке для данного примера, соответствующей выбранному языку.

  2. Дважды щелкните значок ReaderWriterSynchronizationCS.sln или ReaderWriterSynchronizationVB.sln, в зависимости от выбранного языка программирования, чтобы открыть файл в Visual Studio.

  3. В меню Построение выберите команду Построить решение.

Выполнение примера

  1. Перейдите в каталог, содержащий новый исполняемый файл.

  2. В командной строке введите ReaderWriter.exe.

    b6dc69b7.alert_note(ru-ru,VS.90).gifПримечание.

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

Примечания

Дополнительные сведения о синхронизации потоков и монопольном доступе см. в комментариях в исходном коде и файлах build.proj.

В следующем маркированном списке кратко описываются технологии и классы, используемые в этом примере.

  • Синхронизация потоков

ReaderWriterLockИспользуется для защиты логического ресурса, который реализуется как вызов Sleep. Потоки, использующие тип ReaderWriterLock, могут удерживать блокировку двумя способами. Во-первых, поток может удерживать блокировку чтения, которая получает немонопольный доступ и позволяет другим потокам получать блокировку чтения для класса. Во-вторых, поток может запрашивать блокировку записи, которая получает монопольный доступ и не получает доступа до выпуска текущего удержания блокировки чтения и записи.

  • AutoResetEvent Главный поток в примере ожидает объект AutoResetEvent до тех пор, пока он не будет задан. Объект показывает, что последние асинхронные функции завершают свою работу.

  • InterlockedВ примере используются статические методы Interlocked.Increment и Interlocked.Decrement для получения асинхронного доступа к переменной счетчика, чтобы показать, когда значение AutoResetEvent должно быть задано.

  • Работа с потоками

    • ThreadPool При записи управляющего кода разработчикам рекомендуется использовать метод QueueUserWorkItem для внедрения асинхронных вызовов методов. В этом примере используется подход к выполнению кода, который вступает в конфликт с логическим ресурсом.
  • Делегаты

    • WaitCallback Используется для создания безопасного метода обратного вызова для используемого класса ThreadPool.

См. также

Основные понятия

Потоки и работа с потоками

Ссылки

AutoResetEvent

Delegate

Interlocked

Mutex

System.Threading

ThreadPool

WaitCallback

WaitHandle

Другие ресурсы

Объекты и функциональные возможности работы с потоками