Dalam keadaan normal, selama pemrograman multi-utas terlibat, kompleksitas program akan meningkat secara signifikan, kinerja akan menurun secara signifikan, dan kemungkinan bug akan sangat meningkat.
Pemrograman multithread dimaksudkan untuk menjalankan program secara paralel untuk meningkatkan kemampuan pemrosesan data, tetapi dalam banyak kasus, ini melibatkan persaingan untuk sumber daya bersama, sehingga harus dikunci saat memodifikasi objek sumber daya. Namun, ada banyak cara untuk mengimplementasikan kunci, jadi mari kita lihat implementasi dan performa beberapa jenis kunci di C#.
Beberapa cara menggunakan kunci
1. Kunci atom
Mencapai persaingan "tanpa kunci" melalui operasi atom Interlocked.CompareExchange.
Penjelasan resminya adalah menyediakan operasi atom untuk variabel yang dibagikan oleh beberapa utas. Namespace: System.Threading
2. Area kritis
Serialisasi beberapa utas untuk mengakses sumber daya publik atau sepotong kode cepat dan cocok untuk mengontrol akses data. Sintaks kunci di C# adalah gula sintaks untuk area kritis (Monitor).
3. Operasi atom
Operasi atom, yang merupakan kasus khusus, secara inheren aman untuk benang, jadi tidak perlu menguncinya.
Secara resmi ditafsirkan sebagai peningkatan nilai variabel tertentu dalam bentuk operasi atom dan menyimpan hasilnya. Namespace: System.Threading
4. Kunci baca dan tulis
Kunci baca-tulis memungkinkan sumber daya membaca saat program lain sedang menulis, jadi jika sumber daya mengizinkan pembacaan kotor, ini lebih tepat.
Penjelasan resmi menunjukkan status terkunci yang digunakan untuk mengelola akses sumber daya, memungkinkan pembacaan multi-utas atau akses tulis eksklusif. Namespace adalah System.Threading
5. Semaphore
Semaphore, dirancang untuk mengontrol sumber daya pengguna dalam jumlah terbatas.
Penjelasan resmi membatasi jumlah utas yang dapat mengakses sumber daya atau kumpulan sumber daya secara bersamaan. Namespace adalah System.Threading
6. Acara
Digunakan untuk memberi tahu utas bahwa beberapa peristiwa telah terjadi, memulai dimulainya tugas penerus.
Penjelasan resmi menyatakan bahwa peristiwa sinkronisasi utas secara otomatis diatur ulang ketika sinyal diterima setelah utas dirilis. Jenis seperti itu tidak dapat diwariskan.
7. Saling mengecualikan
Ada kelas Mutex di C#, tepat di bawah namespace System.Threading, Mutex sebenarnya adalah mutex, yang tidak hanya dapat menangani persaingan sumber daya antara beberapa utas, tetapi juga menangani persaingan sumber daya antar proses.
Kode pengujian performa
Jalankan kode
Hasil tes kinerja
Catatan: Data di atas hanyalah hasil dari kinerja perangkat keras dari lingkungan pengujian saat ini, dan hanya dapat dibandingkan satu sama lain.
1) Dalam berbagai pengujian, jelas yang tercepat untuk tidak mengunci, jadi cobalah untuk menghindari persaingan sumber daya yang mengarah pada operasi terkunci.
2) Interlocked.CompareExchange secara konsisten menunjukkan kinerja unggul dalam multi-threading, peringkat kedua.
3) Kunci ketiga, zona kritis juga menunjukkan kinerja yang baik, jadi tolong bantah orang lain ketika mereka mengatakan bahwa kinerja kunci rendah.
4) Tempat keempat adalah operasi variabel atom (Atom), tetapi saat ini, hanya mendukung peningkatan dan pengurangan variabel sendiri, dan penerapannya tidak kuat.
5) Kinerja kunci baca/tulis kelima (ReaderWriterLockSlim) juga oke, dan tidak mendukung membaca apa pun, dan kepraktisannya masih relatif bagus.
6) Semaphore, peristiwa, dan mutex yang tersisa memiliki kinerja terburuk, tentu saja, mereka memiliki ruang lingkup aplikasinya sendiri, tetapi mereka tidak berkinerja baik dalam menghadapi persaingan sumber daya.
Alamat tautan asli:Login hyperlink terlihat.
|