Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Blokady czytnika/zapisywania szczupłego (SRW) umożliwiają wątkom pojedynczego procesu uzyskiwanie dostępu do zasobów udostępnionych; są zoptymalizowane pod kątem szybkości i zajmują bardzo mało pamięci. Slim reader-writer blokady nie mogą być współużytkowane przez procesy.
Wątki czytelnika odczytują dane z udostępnionego zasobu, podczas gdy wątki zapisywania zapisują dane w zasobie udostępnionym. Gdy wiele wątków odczytuje i zapisuje przy użyciu udostępnionego zasobu, blokady wyłączne, takie jak sekcja krytyczna lub mutex, mogą stać się wąskim gardłem, jeśli wątki czytnika są uruchamiane w sposób ciągły, ale operacje zapisu są rzadkie.
Blokady SRW zapewniają dwa tryby, w których wątki mogą uzyskiwać dostęp do zasobu udostępnionego:
tryb udostępniony, który przyznaje udostępniony dostęp tylko do odczytu do wielu wątków czytnika, co umożliwia im odczytywanie danych z udostępnionego zasobu jednocześnie. Jeśli operacje odczytu przekraczają operacje zapisu, ta współbieżność zwiększa wydajność i przepływność w porównaniu z krytycznymi sekcjami.
Nuta
Blokady SRW trybu współużytkowanego nie powinny być uzyskiwane rekursywnie, ponieważ może to prowadzić do zakleszczenia w połączeniu z wyłącznym pozyskiwaniem.
tryb wyłączny, który jednocześnie udziela dostępu do odczytu/zapisu do jednego wątku zapisywania. Po uzyskaniu blokady w trybie wyłącznym żaden inny wątek nie może uzyskać dostępu do zasobu udostępnionego, dopóki składnik zapisywania nie zwolni blokady.
Nuta
Blokady SRW trybu wyłącznego nie mogą być uzyskiwane rekursywnie. Jeśli wątek próbuje uzyskać blokadę, która jest już przechowywana, próba zakończy się niepowodzeniem (w przypadku TryAcquireSRWLockExclusive) lub zakleszczenia (dla AcquireSRWLockExclusive)
W obu trybach można uzyskać pojedynczą blokadę SRW; wątki czytnika mogą uzyskiwać je w trybie udostępnionym, podczas gdy wątki modułu zapisywania mogą uzyskiwać je w trybie wyłącznym. Nie ma gwarancji co do kolejności, w jakiej wątki, które żądają własności, zostaną przyznane własność; Blokady SRW nie są ani sprawiedliwe, ani FIFO.
Blokada SRW to rozmiar wskaźnika. Zaletą jest szybkie aktualizowanie stanu blokady. Wadą jest to, że można przechowywać bardzo mało informacji o stanie, więc blokady SRW nie wykrywają nieprawidłowego cyklicznego użycia w trybie udostępnionym. Ponadto wątek, który jest właścicielem blokady SRW w trybie udostępnionym, nie może uaktualnić własności blokady do trybu wyłącznego.
Obiekt wywołujący musi przydzielić strukturę SRWLOCK i zainicjować ją przez wywołanie InitializeSRWLock (w celu dynamicznego zainicjowania struktury) lub przypisania stałej SRWLOCK_INIT do zmiennej struktury (w celu zainicjowania struktury statycznie).
Możesz użyć Application Verifier, aby znaleźć rekursywne (reentrant) użycie blokad SRW.
Poniżej przedstawiono funkcje blokady SRW.
| SRW lock, funkcja | Opis |
|---|---|
| acquireSRWLockExclusive | Uzyskuje blokadę SRW w trybie wyłącznym. |
| AcquireSRWLockShared | Uzyskuje blokadę SRW w trybie udostępnionym. |
| InitializeSRWLock | Zainicjuj blokadę SRW. |
| ReleaseSRWLockExclusive | Zwalnia blokadę SRW otwartą w trybie wyłącznym. |
| ReleaseSRWLockShared | Zwalnia blokadę SRW otwartą w trybie udostępnionym. |
| SleepConditionVariableSRW | Uśpienie dla określonej zmiennej warunku i zwalnia określoną blokadę jako operację niepodzielna. |
| TryAcquireSRWLockExclusive | Próbuje uzyskać szczupłą blokadę czytnika/pisarza (SRW) w trybie wyłącznym. Jeśli wywołanie zakończy się pomyślnie, wątek wywołujący przejmuje własność blokady. |
| TryAcquireSRWLockShared | Próbuje uzyskać szczupłą blokadę czytnika/zapisywania (SRW) w trybie udostępnionym. Jeśli wywołanie zakończy się pomyślnie, wątek wywołujący przejmuje własność blokady. |