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


Замки средства чтения и записи (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) в общем режиме. Если вызов выполнен успешно, вызывающий поток берет на себя ответственность за блокировку.