Mutex

Anda dapat menggunakan objek Mutex untuk menyediakan akses eksklusif ke sumber daya. Kelas Mutex menggunakan lebih banyak sumber daya sistem daripada kelas Monitor, tetapi dapat dikawal di seluruh batas domain aplikasi, dapat digunakan dengan beberapa tunggu, dan dapat digunakan untuk menyinkronkan utas dalam proses yang berbeda. Untuk perbandingan mekanisme sinkronisasi terkelola, lihat Gambaran Umum Primitif Sinkronisasi.

Untuk contoh kode, lihat dokumentasi referensi untuk konstruktor Mutex.

Menggunakan mutex

Utas memanggil metodeWaitOne dari mutex untuk meminta kepemilikan. Panggilan memblokir hingga mutex tersedia, atau sampai interval batas waktu opsional berlalu. Status mutex disinyalir jika tidak ada utas yang memilikinya.

Utas merilis mutex dengan memanggil metode ReleaseMutex. Mutex memiliki afinitas utas; artinya, mutex hanya dapat dirilis oleh utas pemiliknya. Jika utas merilis mutex yang tidak dimilikinya, ApplicationException akan dilemparkan di utas tersebut.

Karena kelas Mutex berasal dari WaitHandle, Anda juga dapat memanggil metode WaitAll statis atau WaitAny dari WaitHandle untuk meminta kepemilikan Mutex dalam kombinasi dengan penanganan tunggu lainnya.

Jika utas memiliki Mutex, utas tersebut dapat menentukan Mutex yang sama dalam panggilan permintaan-tunggu berulang tanpa memblokir eksekusinya; namun, utas tersebut harus melepaskan Mutex sebanyak mungkin untuk melepaskan kepemilikan.

Mutex yang diabaikan

Jika utas berakhir tanpa merilis Mutex, mutex dikatakan telah diabaikan. Hal ini sering menunjukkan kesalahan pemrograman serius karena sumber daya yang dilindungi mutex mungkin dibiarkan dalam keadaan tidak konsisten. AbandonedMutexException dilemparkan ke utas berikutnya yang memperoleh mutex.

Dalam kasus mutex di seluruh-sistem, mutex yang ditinggalkan mungkin menunjukkan bahwa aplikasi telah dihentikan tiba-tiba (misalnya, dengan menggunakan Windows Task Manager).

Mutex lokal dan sistem

Mutex terdiri dari dua jenis: mutex lokal dan mutex sistem bernama. Jika Anda membuat objek Mutex menggunakan konstruktor yang menerima nama, objek tersebut dikaitkan dengan objek sistem-operasi dengan nama tersebut. Mutex sistem bernama terlihat di seluruh sistem operasi dan dapat digunakan untuk menyinkronkan aktivitas proses. Anda dapat membuat beberapa objek Mutex yang mewakili mutex sistem bernama yang sama, dan Anda dapat menggunakan metode OpenExisting untuk membuka mutex sistem bernama yang ada.

Mutex lokal hanya ada dalam proses Anda. Mutex ini dapat digunakan oleh utas apa pun dalam proses Anda yang memiliki referensi ke objek Mutex lokal. Setiap objek Mutex adalah mutex lokal terpisah.

Keamanan kontrol akses untuk mutex sistem

.NET Framework menyediakan kemampuan untuk mengkueri dan mengatur keamanan kontrol akses Windows untuk objek sistem bernama. Melindungi mutex sistem dari saat pembuatan direkomendasikan karena objek sistem bersifat global dan oleh karena itu dapat dikunci oleh kode selain milik Anda sendiri.

Untuk informasi tentang keamanan kontrol akses untuk mutex, lihat kelas MutexSecurity dan MutexAccessRule, enumerasi MutexRights, metode GetAccessControl, SetAccessControl, dan OpenExisting dari kelas Mutex, dan konstruktor Mutex(Boolean, String, Boolean, MutexSecurity).

Catatan

Keamanan kontrol akses untuk mutex sistem hanya tersedia dengan .NET Framework, tidak tersedia dengan .NET Core atau .NET 5+.

Lihat juga