Ikhtisar tentang primitive sinkronisasi

.NET menyediakan berbagai jenis yang dapat Anda gunakan untuk menyinkronkan akses ke sumber daya bersama atau mengoordinasikan interaksi antar utas.

Penting

Gunakan instans primitif sinkronisasi yang sama untuk melindungi akses sumber daya bersama. Jika Anda menggunakan instans primitif sinkronisasi yang berbeda untuk melindungi sumber daya yang sama, Anda akan menghindari perlindungan yang disediakan oleh primitif sinkronisasi.

Kelas WaitHandle dan jenis sinkronisasi yang ringan

Beberapa primitif sinkronisasi .NET berasal dari kelas System.Threading.WaitHandle, yang merangkum handle sinkronisasi sistem operasi asli dan menggunakan mekanisme sinyal untuk interaksi benang. Kelas-kelas tersebut meliputi:

Dalam .NET Framework, karena WaitHandle merupakan turunan dari System.MarshalByRefObject, tipe-tipe ini dapat digunakan untuk menyinkronkan aktivitas thread di seluruh batas domain aplikasi.

Dalam .NET Framework, .NET Core, dan .NET 5+, beberapa jenis ini dapat mewakili handel sinkronisasi sistem bernama, yang terlihat di seluruh sistem operasi dan dapat digunakan untuk sinkronisasi antar-proses:

Untuk informasi selengkapnya, lihat WaitHandle referensi API.

Jenis sinkronisasi ringan tidak bergantung pada penanganan sistem operasi yang mendasar dan lebih sering memberikan performa yang lebih baik. Namun, mereka tidak dapat digunakan untuk sinkronisasi antar-proses. Gunakan jenis tersebut untuk sinkronisasi utas dalam satu aplikasi.

Beberapa jenis tersebut adalah alternatif untuk jenis yang berasal dari WaitHandle. Misalnya, SemaphoreSlim adalah alternatif ringan untuk Semaphore.

Sinkronisasi akses ke sumber daya bersama

.NET menyediakan berbagai primitif sinkronisasi untuk mengontrol akses ke sumber daya bersama oleh beberapa utas.

Kelompok monitor

Kelas System.Threading.Monitor memberikan akses yang saling eksklusif ke sumber daya bersama dengan memperoleh atau melepaskan kunci pada objek yang mengidentifikasi sumber daya. Saat kunci sedang dipegang, utas yang memegang kunci dapat kembali memperoleh dan melepaskan kunci. Thread lain diblokir dari memperoleh kunci dan metode Monitor.Enter menunggu hingga kunci dilepaskan. Metode ini Enter mendapatkan kunci yang telah dilepaskan. Anda juga dapat menggunakan Monitor.TryEnter metode untuk menentukan jumlah waktu di mana utas mencoba memperoleh kunci. Karena kelas Monitor memiliki afinitas utas, utas yang memperoleh kunci harus melepaskan kunci dengan memanggil metode Monitor.Exit.

Anda dapat mengoordinasikan interaksi utas yang memperoleh kunci pada objek yang sama dengan menggunakan metode Monitor.Wait, Monitor.Pulse, dan Monitor.PulseAll.

Untuk informasi selengkapnya, lihat Monitor referensi API.

Nota

Gunakan pernyataan kunci di C# dan pernyataan SyncLock di Visual Basic untuk menyinkronkan akses ke sumber daya bersama alih-alih menggunakan kelas secara Monitor langsung. Pernyataan tersebut diimplementasikan dengan menggunakan metode Enter dan Exit serta blok try…finally untuk memastikan bahwa kunci yang diperoleh selalu dilepaskan.

Kelas Mutex

Kelas System.Threading.Mutex , seperti Monitor, memberikan akses eksklusif ke sumber daya bersama. Gunakan salah satu metode Mutex.WaitOne kelebihan beban untuk meminta kepemilikan mutex. Seperti Monitor, Mutex memiliki keterikatan utas dan utas yang memperoleh mutex harus melepaskannya dengan memanggil metode Mutex.ReleaseMutex.

Tidak seperti Monitor, Mutex kelas dapat digunakan untuk sinkronisasi antar-proses. Untuk melakukannya, gunakan mutex dengan nama, yang terlihat di seluruh sistem operasi. Untuk membuat instans mutex bernama, gunakan konstruktor Mutex yang menentukan nama. Anda juga dapat memanggil metode Mutex.OpenExisting untuk membuka mutex sistem yang sudah ada.

Untuk informasi selengkapnya, lihat artikel Mutexes dan Mutex referensi API.

Struktur SpinLock

Struktur System.Threading.SpinLock , seperti Monitor, memberikan akses eksklusif ke sumber daya bersama berdasarkan ketersediaan kunci. Ketika SpinLock mencoba untuk memperoleh akses yang tidak tersedia, ia akan menunggu dalam perulangan, berulang kali memeriksa hingga akses tersebut tersedia.

Untuk informasi selengkapnya tentang manfaat dan kelemahan penggunaan kunci putar, lihat artikel SpinLock dan SpinLock referensi API.

Kelas ReaderWriterLockSlim

Kelas ini System.Threading.ReaderWriterLockSlim memberikan akses eksklusif ke sumber daya bersama untuk tujuan penulisan dan mengizinkan beberapa utas untuk mengakses sumber daya secara bersamaan dalam proses membaca. Anda mungkin ingin menggunakan ReaderWriterLockSlim untuk menyinkronkan akses ke struktur data bersama yang mendukung operasi baca aman utas, tetapi memerlukan akses eksklusif untuk melakukan operasi tulis. Ketika utas meminta akses eksklusif (misalnya, dengan memanggil metode ReaderWriterLockSlim.EnterWriteLock), permintaan pembaca dan penulis berikutnya akan tertahan sampai semua pembaca yang ada telah melepas kunci, dan penulis telah masuk dan keluar dari kunci.

Untuk informasi selengkapnya, lihat ReaderWriterLockSlim referensi API.

Kelas Semaphore dan SemaphoreSlim

Kelas System.Threading.Semaphore dan System.Threading.SemaphoreSlim membatasi jumlah utas yang dapat mengakses sumber daya bersama atau kumpulan sumber daya secara bersamaan. Utas tambahan yang meminta sumber daya menunggu hingga utas apa pun merilis semaphore. Karena semaphore tidak memiliki afinitas benang, sebuah benang dapat memperoleh semaphore dan benang lainnya dapat melepaskannya.

SemaphoreSlim adalah alternatif ringan untuk Semaphore dan hanya dapat digunakan untuk sinkronisasi dalam satu batas proses.

Di Windows, Anda dapat menggunakan Semaphore untuk sinkronisasi antarproses. Untuk melakukannya, buat Semaphore instance yang mewakili semaphore sistem bernama dengan menggunakan salah satu konstruktor Semaphore yang menspesifikasikan nama atau metode Semaphore.OpenExisting. SemaphoreSlim tidak mendukung semaphore sistem yang diberi nama.

Untuk informasi selengkapnya, lihat artikel Semaphore dan SemaphoreSlim serta referensi API Semaphore atau SemaphoreSlim.

Interaksi thread, atau penyinyalan

Interaksi utas (atau sinyal utas) berarti bahwa utas harus menunggu pemberitahuan, atau sinyal, dari satu atau beberapa utas untuk melanjutkan. Misalnya, jika utas A memanggil metode utas B, utas Thread.Join A diblokir hingga utas B selesai. Primitif sinkronisasi yang dijelaskan di bagian sebelumnya menyediakan mekanisme yang berbeda untuk sinyal: dengan melepaskan kunci, utas memberi tahu utas lain bahwa ia dapat melanjutkan dengan memperoleh kunci.

Bagian ini menjelaskan konstruksi sinyal tambahan yang disediakan oleh .NET.

Kelas EventWaitHandle, AutoResetEvent, ManualResetEvent, dan ManualResetEventSlim

Kelas System.Threading.EventWaitHandle mewakili kejadian sinkronisasi benang.

Peristiwa sinkronisasi dapat berada dalam keadaan tidak bersinyal atau bersinyal. Saat status peristiwa tidak diberi sinyal, utas yang memanggil overload fungsi dari peristiwa WaitOne diblokir sampai peristiwa diberi sinyal. Metode EventWaitHandle.Set ini mengatur status peristiwa yang akan disinyalir.

Perilaku dari sebuah EventWaitHandle yang telah diberi sinyal tergantung pada mode pengaturan ulangnya.

Di Windows, Anda dapat menggunakan EventWaitHandle untuk sinkronisasi antarproses. Untuk melakukannya, buat instance EventWaitHandle yang mewakili peristiwa sinkronisasi sistem bernama dengan menggunakan salah satu konstruktor EventWaitHandle yang menentukan nama atau metode EventWaitHandle.OpenExisting.

Untuk informasi selengkapnya, lihat artikel EventWaitHandle . Untuk referensi API, lihat EventWaitHandle, , AutoResetEventManualResetEvent, dan ManualResetEventSlim.

Kelas CountdownEvent

Kelas System.Threading.CountdownEvent mewakili peristiwa yang ditetapkan saat jumlahnya adalah nol. Meskipun CountdownEvent.CurrentCount lebih besar dari nol, utas yang memanggil CountdownEvent.Wait diblokir. Memanggil CountdownEvent.Signal untuk mengurangi hitungan kejadian.

Berbeda dengan ManualResetEvent atau ManualResetEventSlim, yang dapat Anda gunakan untuk membuka blokir beberapa utas dengan sinyal dari satu utas, Anda dapat menggunakan CountdownEvent untuk membuka blokir satu atau lebih utas dengan sinyal dari beberapa utas.

Untuk informasi selengkapnya, lihat artikel CountdownEvent dan CountdownEvent referensi API.

Kelas hambatan

Kelas System.Threading.Barrier mewakili penghalang eksekusi utas. Utas yang mencapai metode Barrier.SignalAndWait memberi sinyal bahwa ia telah mencapai penghalang dan menunggu sampai utas peserta lainnya mencapai penghalang itu. Ketika semua utas peserta mencapai hambatan, mereka melanjutkan dan hambatan diatur ulang dan dapat digunakan lagi.

Anda dapat menggunakan Barrier ketika satu atau beberapa utas memerlukan hasil utas lain sebelum melanjutkan ke fase komputasi berikutnya.

Untuk informasi selengkapnya, lihat artikel Hambatan dan Barrier referensi API.

Kelas yang saling mengunci

Kelas ini System.Threading.Interlocked menyediakan metode statis yang melakukan operasi atom sederhana pada variabel. Operasi atom tersebut termasuk penambahan, penginkrementan dan pengurangan, pertukaran dan pertukaran bersyarat yang tergantung pada perbandingan, serta operasi membaca nilai bilangan bulat 64-bit.

Untuk informasi selengkapnya, lihat Interlocked referensi API.

Struktur SpinWait

Struktur System.Threading.SpinWait ini menyediakan dukungan untuk menunggu yang berbasis spin. Anda mungkin ingin menggunakannya ketika utas harus menunggu peristiwa diberi sinyal atau kondisi terpenuhi, tetapi waktu tunggu aktual diperkirakan lebih pendek daripada waktu tunggu yang diperlukan dengan menggunakan handle penundaan atau dengan menghalangi utas. Dengan menggunakan SpinWait, Anda dapat menentukan waktu yang singkat untuk berputar saat menunggu, lalu menghasilkan (misalnya, dengan menunggu atau tidur) hanya jika kondisi tidak terpenuhi dalam waktu yang ditentukan.

Untuk informasi selengkapnya, lihat artikel SpinWait dan SpinWait referensi API.

Lihat juga