Struktur data untuk pemrograman paralel

.NET menyediakan beberapa jenis yang berguna dalam pemrograman paralel, termasuk satu set kelas koleksi bersamaan, primitif sinkronisasi ringan, dan jenis untuk inisialisasi malas. Anda dapat menggunakan jenis ini dengan kode aplikasi multi-utas apa pun, termasuk Pustaka Paralel Tugas dan PLINQ.

Kelas Koleksi Bersamaan

Kelas koleksi di namespace System.Collections.Concurrent menyediakan operasi penambahan dan penghapusan utas aman yang menghindari kunci sedapat mungkin dan menggunakan penguncian yang sangat harus di mana kunc diperlukan. Kelas koleksi bersamaan tidak mengharuskan kode pengguna untuk mengambil kunci apa pun saat mengakses item. Kelas koleksi bersamaan dapat secara signifikan meningkatkan performa atas jenis seperti System.Collections.ArrayList dan System.Collections.Generic.List<T> (dengan penguncian yang diterapkan-pengguna) dalam skenario di mana beberapa utas menambahkan dan menghapus item dari suatu koleksi.

Tabel berikut mencantumkan kelas koleksi bersamaan:

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

Untuk informasi selengkapnya, lihat Koleksi Thread-Safe.

Primitif Sinkronisasi

Primitif sinkronisasi di namespace System.Threading memungkinkan konkurensi terperinci dan performa yang lebih cepat dengan menghindari mekanisme penguncian mahal yang ditemukan dalam kode multi-perangkaian warisan.

Tabel berikut ini mencantumkan jenis sinkronisasi:

Tipe Deskripsi
System.Threading.Barrier Memungkinkan beberapa utas untuk bekerja pada 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 Barrier.
System.Threading.CountdownEvent Menyederhanakan skenario fork dan gabung dengan menyediakan mekanisme pertemuan yang mudah. Untuk informasi selengkapnya, lihat CountdownEvent..
System.Threading.ManualResetEventSlim Primitif sinkronisasi 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 satu 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 pendek, SpinLock menawarkan performa yang lebih baik daripada bentuk penguncian lainnya. Untuk informasi selengkapnya, lihat SpinLock..
System.Threading.SpinWait Jenis yang kecil dan ringan yang akan berputar selama waktu tertentu 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 malas, memori untuk objek tidak dialokasikan sampai diperlukan. Inisialisasi malas dapat meningkatkan performa dengan menyebarkan alokasi objek secara merata selama masa pakai program. Anda dapat mengaktifkan inisialisasi malas untuk jenis kustom apa pun dengan membungkus Lazy<T> jenis.

Tabel berikut mencantumkan jenis inisialisasi malas:

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

Untuk informasi selengkapnya, 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 gabungan sebagai pengecualian tunggal. Jenis System.Threading.Tasks.Task dan System.Threading.Tasks.Parallel serta PLINQ menggunakan AggregateException secara ekstensif untuk tujuan ini. Untuk informasi selengkapnya, lihat Penanganan Pengecualian dan Cara: Menangani Pengecualian dalam Kueri PLINQ.

Lihat juga