Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 4864|Jawab: 4

[Sumber] 【Putar】 C# konkurensi multi-utas di bawah berbagai kunci

[Salin tautan]
Dipaparkan pada 2023-4-13 18:44:49 | | | |
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.





Mantan:ASP.NET Inti (16) Bergantung pada injeksi layanan pendaftaran dinamis
Depan:Rute lunak OpenWrt mulai berjalan melalui stik USB
 Tuan tanah| Dipaparkan pada 2023-4-13 18:46:52 |
Program C# hanya mengizinkan satu instance untuk menjalankan kode yang benar
https://www.itsvse.com/thread-3391-1-1.html

Perbedaan antara ManualResetEvent dan AutoResetEvent yang dipelajari oleh utas C#
https://www.itsvse.com/thread-4810-1-1.html

[Pertempuran aktual]. NET/C# menggunakan SemaphoreSlim untuk membatasi metode eksekusi bersamaan
https://www.itsvse.com/thread-10259-1-1.html

Penggunaan C# Read/Write Lock ReaderWriterLockSlim
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Pengguna multithreaded concurrency lock(string){...} Penjelasan rinci
https://www.itsvse.com/thread-7764-1-1.html
Dipaparkan pada 2023-4-13 19:21:44 |
Pelajari sedikit...
Dipaparkan pada 2023-5-16 20:03:52 |
Pelajari sedikit...
Dipaparkan pada 2023-5-19 11:41:25 |
Belajar belajar
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com