Bagikan melalui


Struktur Data untuk Pemrograman Paralel

.NET menyediakan beberapa tipe yang berguna dalam pemrograman paralel, termasuk sekumpulan kelas koleksi konkuren, primitif sinkronisasi ringan, dan tipe untuk inisialisasi tunda. Anda dapat menggunakan tipe ini dengan kode aplikasi multithreading apa pun, termasuk Pustaka Paralel Tugas dan PLINQ.

Kelas Koleksi Bersamaan

Kelas koleksi di System.Collections.Concurrent namespace menyediakan operasi penambahan dan penghapusan yang aman dari utas yang menghindari kunci sebisa mungkin dan menggunakan penguncian yang terperinci di mana penguncian diperlukan. Kelas koleksi bersamaan tidak memerlukan kode pengguna untuk mengambil kunci apa pun saat mengakses item. Kelas koleksi konkuren dapat secara signifikan meningkatkan performa dibandingkan dengan tipe seperti System.Collections.ArrayList dan System.Collections.Generic.List<T> (dengan penguncian yang diterapkan pengguna) dalam skenario ketika beberapa thread menambahkan dan menghapus item dari koleksi.

Tabel berikut mencantumkan kelas pengumpulan bersamaan:

Tipe Deskripsi
System.Collections.Concurrent.BlockingCollection<T> Menyediakan kemampuan pemblokiran dan pembatas untuk koleksi aman utas yang mengimplementasikan System.Collections.Concurrent.IProducerConsumerCollection<T>. Utas produsen memblokir jika tidak ada slot yang tersedia atau jika koleksi penuh. Blok utas konsumen jika koleksi kosong. Jenis ini juga mendukung akses non-pemblokiran oleh konsumen dan produsen. BlockingCollection<T> dapat digunakan sebagai kelas dasar atau penyimpanan pendukung untuk menyediakan pembatasan dan pemblokiran pada kelas koleksi apa pun yang mendukung IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Implementasi struktur data aman dari kesalahan utas yang menyediakan operasi penambahan dan pengambilan yang dapat diskalakan.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Jenis kamus bersamaan dan dapat diskalakan.
System.Collections.Concurrent.ConcurrentQueue<T> Antrean FIFO bersamaan dan dapat diskalakan.
System.Collections.Concurrent.ConcurrentStack<T> Tumpukan LIFO bersamaan dan dapat diskalakan.

Untuk informasi selengkapnya, lihat KoleksiThread-Safe.

Fasilitas Sinkronisasi

Primitif sinkronisasi di System.Threading namespace memungkinkan konkurensi yang lebih terperinci dan performa yang lebih cepat dengan menghindari mekanisme penguncian mahal yang ditemukan dalam kode multithreading kuno.

Tabel berikut mencantumkan jenis sinkronisasi:

Tipe Deskripsi
System.Threading.Barrier Memungkinkan beberapa thread mengerjakan sebuah algoritma secara paralel dengan menyediakan titik di mana setiap tugas dapat memberi sinyal kedatangannya dan kemudian memblokir hingga beberapa atau semua tugas telah tiba. Untuk informasi selengkapnya, lihat Penghalang.
System.Threading.CountdownEvent Menyederhanakan skenario fork dan join dengan menyediakan mekanisme pertemuan yang mudah. Untuk informasi selengkapnya, lihat CountdownEvent.
System.Threading.ManualResetEventSlim Primitif sinkronisasi yang mirip dengan System.Threading.ManualResetEvent. ManualResetEventSlim lebih ringan tetapi hanya dapat digunakan untuk komunikasi intra-proses.
System.Threading.SemaphoreSlim Primitif sinkronisasi yang membatasi jumlah utas yang dapat secara bersamaan mengakses sumber daya atau kumpulan sumber daya. Untuk informasi selengkapnya, lihat Semaphore dan SemaphoreSlim.
System.Threading.SpinLock Kunci pengecualian timbal balik primitif yang menyebabkan utas yang mencoba memperoleh kunci untuk menunggu dalam perulangan, atau berputar, untuk jangka waktu tertentu sebelum menghasilkan kuantumnya. Dalam skenario di mana penantian kunci diperkirakan singkat, SpinLock menawarkan performa yang lebih baik daripada bentuk penguncian lainnya. Untuk informasi selengkapnya, lihat SpinLock.
System.Threading.SpinWait Jenis kecil dan ringan yang akan berputar untuk waktu yang ditentukan dan akhirnya menempatkan utas ke dalam status tunggu jika jumlah putaran terlampaui. Untuk informasi selengkapnya, lihat SpinWait.

Untuk informasi selengkapnya, lihat:

Kelas Inisialisasi Malas

Dengan inisialisasi lambat, memori untuk objek tidak dialokasikan sampai diperlukan. Inisialisasi tertunda dapat meningkatkan kinerja dengan mendistribusikan alokasi objek secara merata selama masa pakai program. Anda dapat mengaktifkan inisialisasi malas untuk tipe kustom apa pun dengan membungkus tipe Lazy<T>.

Tabel berikut mencantumkan tipe inisialisasi malas:

Tipe Deskripsi
System.Lazy<T> Menyediakan inisialisasi malas yang ringan dan aman utas.
System.Threading.ThreadLocal<T> Menyediakan nilai yang diinisialisasi secara malas berdasarkan utas, dengan setiap utas secara malas memanggil fungsi inisialisasi.
System.Threading.LazyInitializer Menyediakan metode statis yang menghindari kebutuhan untuk mengalokasikan instans inisialisasi tunda yang khusus. Sebaliknya, mereka menggunakan referensi untuk memastikan target telah diinisialisasi saat diakses.

Untuk informasi lebih lanjut, lihat Inisialisasi Malas.

Pengecualian Agregat

Jenis System.AggregateException ini dapat digunakan untuk menangkap beberapa pengecualian yang dilemparkan secara bersamaan pada utas terpisah, dan mengembalikannya ke utas yang bergabung sebagai pengecualian tunggal. Jenis System.Threading.Tasks.Task dan System.Threading.Tasks.Parallel dan PLINQ menggunakan AggregateException secara ekstensif untuk tujuan ini. Untuk informasi selengkapnya, lihat Penanganan Pengecualian dan Cara: Menangani Pengecualian dalam Kueri PLINQ.

Lihat juga