Struktur Data Sinkronisasi

Runtime Konkurensi menyediakan beberapa struktur data yang memungkinkan Anda menyinkronkan akses ke data bersama dari beberapa utas. Struktur data ini berguna ketika Anda telah berbagi data yang jarang Anda ubah. Objek sinkronisasi, misalnya, bagian penting, menyebabkan utas lain menunggu hingga sumber daya bersama tersedia. Oleh karena itu, jika Anda menggunakan objek seperti itu untuk menyinkronkan akses ke data yang sering digunakan, Anda dapat kehilangan skalabilitas dalam aplikasi Anda. Pustaka Pola Paralel (PPL) menyediakan kelas konkurensi::combinable, yang memungkinkan Anda berbagi sumber daya di antara beberapa utas atau tugas tanpa perlu sinkronisasi. Untuk informasi selengkapnya tentang combinable kelas, lihat Kontainer dan Objek Paralel.

Bagian

Topik ini menjelaskan jenis blok pesan asinkron berikut secara rinci:

critical_section

Kelas konkurensi::critical_section mewakili objek pengecualian timbal balik kooperatif yang menghasilkan tugas lain alih-alih mendahuluinya. Bagian penting berguna ketika beberapa utas memerlukan akses baca dan tulis eksklusif ke data bersama.

Kelas critical_section ini tidak masuk kembali. Metode konkurensi::critical_section::lock memberikan pengecualian jenis konkurensi::improper_lock jika dipanggil oleh utas yang sudah memiliki kunci.

Metode dan Fitur

Tabel berikut menunjukkan metode penting yang ditentukan oleh critical_section kelas.

Metode Deskripsi
kunci Memperoleh bagian penting. Konteks panggilan memblokir hingga memperoleh kunci.
try_lock Mencoba memperoleh bagian penting, tetapi tidak memblokir.
Membuka Merilis bagian penting.

[Atas]

reader_writer_lock

Kelas konkurensi::reader_writer_lock menyediakan operasi baca/tulis aman utas untuk data bersama. Gunakan kunci pembaca/penulis saat beberapa utas memerlukan akses baca bersamaan ke sumber daya bersama tetapi jarang menulis ke sumber daya bersama tersebut. Kelas ini hanya memberikan satu akses tulis utas ke objek kapan saja.

Kelas reader_writer_lock dapat berkinerja lebih baik daripada critical_section kelas karena critical_section objek memperoleh akses eksklusif ke sumber daya bersama, yang mencegah akses baca bersamaan.

critical_section Seperti kelas , reader_writer_lock kelas mewakili objek pengecualian timbal balik kooperatif yang menghasilkan tugas lain alih-alih mendahuluinya.

Ketika utas yang harus menulis ke sumber daya bersama memperoleh kunci pembaca/penulis, utas lain yang juga harus mengakses sumber daya diblokir sampai penulis melepaskan kunci. Kelas reader_writer_lock adalah contoh kunci preferensi tulis, yang merupakan kunci yang membuka blokir penulis tunggu sebelum membuka blokir pembaca tunggu.

critical_section Seperti kelas , reader_writer_lock kelas tidak masuk kembali. Metode konkurensi::reader_writer_lock::lock dan konkurensi::reader_writer_lock::lock_read melempar pengecualian jenis improper_lock jika dipanggil oleh utas yang sudah memiliki kunci.

Catatan

reader_writer_lock Karena kelas tidak masuk kembali, Anda tidak dapat meningkatkan kunci baca-saja ke kunci pembaca/penulis atau menurunkan tingkat kunci pembaca/penulis ke kunci baca-saja. Melakukan salah satu operasi ini menghasilkan perilaku yang tidak ditentukan.

Metode dan Fitur

Tabel berikut menunjukkan metode penting yang ditentukan oleh reader_writer_lock kelas.

Metode Deskripsi
kunci Memperoleh akses baca/tulis ke kunci.
try_lock Mencoba memperoleh akses baca/tulis ke kunci, tetapi tidak memblokir.
lock_read Memperoleh akses baca-saja ke kunci.
try_lock_read Mencoba memperoleh akses baca-saja ke kunci, tetapi tidak memblokir.
Membuka Melepaskan kunci.

[Atas]

scoped_lock dan scoped_lock_read

Kelas critical_section dan reader_writer_lock menyediakan kelas pembantu berlapis yang menyederhanakan cara Anda bekerja dengan objek pengecualian bersama. Kelas pembantu ini dikenal sebagai kunci terlingkup.

Kelas critical_section berisi kelas konkurensi::critical_section::scoped_lock . Konstruktor memperoleh akses ke objek yang disediakan critical_section ; destruktor merilis akses ke objek tersebut. Kelas reader_writer_lock berisi kelas konkurensi::reader_writer_lock::scoped_lock , yang mirip critical_section::scoped_lock, kecuali bahwa kelas tersebut mengelola akses tulis ke objek yang disediakan reader_writer_lock . Kelas juga reader_writer_lock berisi kelas konkurensi::reader_writer_lock::scoped_lock_read . Kelas ini mengelola akses baca ke objek yang disediakan reader_writer_lock .

Kunci tercakup memberikan beberapa manfaat saat Anda bekerja dengan critical_section objek dan reader_writer_lock secara manual. Biasanya, Anda mengalokasikan kunci terlingkup pada tumpukan. Kunci tercakup melepaskan akses ke objek pengecualian bersamanya secara otomatis saat dihancurkan; oleh karena itu, Anda tidak membuka kunci objek yang mendasar secara manual. Ini berguna ketika fungsi berisi beberapa return pernyataan. Kunci terlingkup juga dapat membantu Anda menulis kode yang aman pengecualian. throw Ketika pernyataan menyebabkan tumpukan melepas lelah, destruktor untuk kunci lingkup aktif dipanggil, dan oleh karena itu objek pengecualian bersama selalu dilepaskan dengan benar.

Catatan

Saat Anda menggunakan critical_section::scoped_lockkelas , reader_writer_lock::scoped_lock, dan reader_writer_lock::scoped_lock_read , jangan melepaskan akses secara manual ke objek pengecualian timah yang mendasar. Ini dapat menempatkan runtime dalam status tidak valid.

event

Kelas konkurensi::event mewakili objek sinkronisasi yang statusnya dapat disinyalir atau tidak diberi sinyal. Tidak seperti objek sinkronisasi, seperti bagian penting, yang tujuannya adalah untuk melindungi akses ke data bersama, peristiwa menyinkronkan alur eksekusi.

Kelas event berguna ketika satu tugas telah selesai bekerja untuk tugas lain. Misalnya, satu tugas mungkin memberi sinyal tugas lain bahwa tugas tersebut telah membaca data dari koneksi jaringan atau dari file.

Metode dan Fitur

Tabel berikut menunjukkan beberapa metode penting yang ditentukan oleh event kelas.

Metode Deskripsi
Tunggu Menunggu peristiwa menjadi sinyal.
set Mengatur peristiwa ke status yang disinyalir.
Reset Mengatur peristiwa ke status tidak diberi sinyal.
wait_for_multiple Menunggu beberapa peristiwa menjadi sinyal.

Contoh

Untuk contoh yang menunjukkan cara menggunakan event kelas , lihat Membandingkan Struktur Data Sinkronisasi dengan WINDOWS API.

[Atas]

Membandingkan Struktur Data Sinkronisasi dengan WINDOWS API
Membandingkan perilaku struktur data sinkronisasi dengan yang disediakan oleh Windows API.

Runtime Konkurensi
Menjelaskan Runtime Konkurensi, yang menyederhanakan pemrograman paralel, dan berisi tautan ke topik terkait.