Kunci Pembaca/Penulis Ramping (SRW)

Kunci pembaca/penulis ramping (SRW) memungkinkan utas dari satu proses untuk mengakses sumber daya bersama; mereka dioptimalkan untuk kecepatan dan menempati memori yang sangat sedikit. Kunci pembaca-penulis ramping tidak dapat dibagikan di seluruh proses.

Utas pembaca membaca data dari sumber daya bersama sedangkan utas penulis menulis data ke sumber daya bersama. Ketika beberapa utas membaca dan menulis menggunakan sumber daya bersama, kunci eksklusif seperti bagian penting atau mutex dapat menjadi hambatan jika utas pembaca berjalan terus menerus tetapi operasi tulis jarang terjadi.

Kunci SRW menyediakan dua mode di mana utas dapat mengakses sumber daya bersama:

  • Mode bersama, yang memberikan akses baca-saja bersama ke beberapa utas pembaca, yang memungkinkan mereka membaca data dari sumber daya bersamaan secara bersamaan. Jika operasi baca melebihi operasi tulis, konkurensi ini meningkatkan performa dan throughput dibandingkan dengan bagian penting.

    Catatan

    Kunci SRW mode bersama tidak boleh diperoleh secara rekursif karena ini dapat menyebabkan kebuntuan ketika dikombinasikan dengan akuisisi eksklusif.

  • Mode eksklusif, yang memberikan akses baca/tulis ke satu utas penulis pada satu waktu. Ketika kunci telah diperoleh dalam mode eksklusif, tidak ada utas lain yang dapat mengakses sumber daya bersama sampai penulis melepaskan kunci.

    Catatan

    Kunci SRW mode eksklusif tidak dapat diperoleh secara rekursif. Jika utas mencoba memperoleh kunci yang sudah disimpannya, upaya tersebut akan gagal (untuk TryAcquireSRWLockExclusive) atau kebuntuan (untuk AcquireSRWLockExclusive)

Kunci SRW tunggal dapat diperoleh dalam salah satu mode; utas pembaca dapat memperolehnya dalam mode bersama sedangkan utas penulis dapat memperolehnya dalam mode eksklusif. Tidak ada jaminan tentang urutan di mana utas yang meminta kepemilikan akan diberikan kepemilikan; Kunci SRW tidak adil atau FIFO.

Kunci SRW adalah ukuran pointer. Keuntungannya adalah cepat untuk memperbarui status kunci. Kerugiannya adalah bahwa sangat sedikit informasi status yang dapat disimpan, sehingga kunci SRW tidak mendeteksi penggunaan rekursif yang salah dalam mode bersama. Selain itu, utas yang memiliki kunci SRW dalam mode bersama tidak dapat meningkatkan kepemilikannya atas kunci ke mode eksklusif.

Pemanggil harus mengalokasikan struktur SRWLOCK dan menginisialisasinya dengan memanggil InitializeSRWLock (untuk menginisialisasi struktur secara dinamis) atau menetapkan SRWLOCK_INIT konstanta ke variabel struktur (untuk menginisialisasi struktur secara statis).

Anda dapat menggunakan Pemverifikasi Aplikasi untuk menemukan penggunaan kunci SRW rekursif (reentrant).

Berikut ini adalah fungsi kunci SRW.

Fungsi kunci SRW Deskripsi
AcquireSRWLockExclusive Memperoleh kunci SRW dalam mode eksklusif.
AcquireSRWLockshared Memperoleh kunci SRW dalam mode bersama.
InitializeSRWLock Menginisialisasi kunci SRW.
ReleaseSRWLockExclusive Merilis kunci SRW yang dibuka dalam mode eksklusif.
ReleaseSRWLockshared Melepaskan kunci SRW yang dibuka dalam mode bersama.
SleepConditionVariableSRW Tidur pada variabel kondisi yang ditentukan dan melepaskan kunci yang ditentukan sebagai operasi atomik.
TryAcquireSRWLockExclusive Mencoba memperoleh kunci pembaca/penulis ramping (SRW) dalam mode eksklusif. Jika panggilan berhasil, utas panggilan mengambil kepemilikan kunci.
TryAcquireSRWLockShared Mencoba memperoleh kunci pembaca/penulis ramping (SRW) dalam mode bersama. Jika panggilan berhasil, utas panggilan mengambil kepemilikan kunci.