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


Блокировки с тонким средством чтения и записи (SRW)

Блокировки средства чтения и записи (SRW) позволяют потокам одного процесса получить доступ к общим ресурсам; они оптимизированы для скорости и занимают очень мало памяти. Блокировкы средства чтения с помощью средства чтения нельзя совместно использовать в процессах.

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

Блокировки SRW предоставляют два режима, в которых потоки могут получить доступ к общему ресурсу:

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

    Заметка

    Блокировки SRW общего режима не должны быть получены рекурсивно, так как это может привести к взаимоблокировкам при сочетании с эксклюзивным приобретением.

  • монопольный режим, который предоставляет доступ для чтения и записи к одному потоку записи за раз. Когда блокировка была приобретена в монопольном режиме, ни один другой поток не сможет получить доступ к общему ресурсу до тех пор, пока модуль записи не выпустит блокировку.

    Заметка

    Монопольные блокировки SRW нельзя получить рекурсивно. Если поток пытается получить блокировку, которая уже содержится, эта попытка завершится ошибкой (для TryAcquireSRWLockExclusive) или взаимоблокировки (для AcquireSRWLockExclusive)

Одну блокировку SRW можно получить в любом режиме; Потоки чтения могут получить его в общем режиме, в то время как потоки записи могут получить его в монопольном режиме. Нет никаких гарантий о порядке, в котором потоки, запрашивающие владение, будут предоставлены права владения; Блокировки SRW не являются ни справедливыми, ни FIFO.

Блокировка SRW — это размер указателя. Преимущество заключается в том, что это быстро для обновления состояния блокировки. Недостатком является то, что очень мало сведений о состоянии можно хранить, поэтому блокировки SRW не обнаруживают неправильное рекурсивное использование в общем режиме. Кроме того, поток, который владеет блокировкой SRW в общем режиме, не может обновить его владение блокировкой до монопольного режима.

Вызывающий объект должен выделить структуру SRWLOCK и инициализировать ее путем вызова initializeSRWLock (для динамической инициализации структуры) или назначения константы SRWLOCK_INIT переменной структуры (для инициализации структуры статически).

Вы можете использовать средство проверки приложений для поиска рекурсивных (повторное использование) блокировок SRW.

Ниже приведены функции блокировки SRW.

Функция блокировки SRW Описание
AcquireSRWLockExclusive Получает блокировку SRW в монопольном режиме.
AcquireSRWLockShared Получает блокировку SRW в общем режиме.
InitializeSRWLock Инициализация блокировки SRW.
ReleaseSRWLockExclusive Освобождает блокировку SRW, которая была открыта в монопольном режиме.
releaseSRWLockShared Освобождает блокировку SRW, которая была открыта в общем режиме.
SleepConditionVariableSRW Спящий режим в указанной переменной условия и освобождает указанную блокировку как атомарную операцию.
TryAcquireSRWLockExclusive Пытается получить блокировку средства чтения или записи (SRW) в монопольном режиме. Если вызов выполнен успешно, вызывающий поток берет на себя ответственность за блокировку.
TryAcquireSRWLockShared Пытается получить блокировку средства чтения или записи (SRW) в общем режиме. Если вызов выполнен успешно, вызывающий поток берет на себя ответственность за блокировку.