Bagikan melalui


Mutex

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

Untuk contoh kode, lihat dokumentasi referensi konstruktor Mutex.

Menggunakan mutex

Thread memanggil metode WaitOne dari mutex untuk mengambil alih kepemilikan. Panggilan akan tertahan hingga mutex tersedia, atau sampai interval waktu habis opsional berlalu. Status mutex disinyalir jika tidak ada utas yang memilikinya.

Thread melepaskan mutex dengan memanggil metode ReleaseMutex-nya. Mutex memiliki afinitas utas; artinya, muteks hanya dapat dirilis oleh utas yang memilikinya. Jika suatu utas melepaskan mutex yang bukan miliknya, ApplicationException akan dilemparkan di dalam utas tersebut.

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

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

Mutex yang ditinggalkan

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

Dalam kasus muteks sistem secara keseluruhan, muteks yang ditinggalkan mungkin menunjukkan bahwa aplikasi telah dihentikan secara tiba-tiba (misalnya, dengan menggunakan Task Manager Windows).

Mutex lokal dan sistem

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

Mutex lokal ini hanya terdapat dalam proses Anda. Ini dapat digunakan oleh utas apa pun dalam proses Anda yang memiliki referensi ke objek lokal Mutex . Setiap Mutex objek 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. Disarankan untuk melindungi mutex sistem sejak pembuatan karena objek sistem bersifat global dan oleh karena itu dapat dikunci oleh kode di luar milik Anda.

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

Nota

Keamanan kontrol akses untuk mutex pada sistem hanya tersedia di .NET Framework dan tidak tersedia di .NET Core atau .NET 5+.

Lihat juga