Apa perbedaan antara kunci dan Mutex?


Jawaban:


146

Sebuah kunci khusus untuk AppDomain, sementara Mutex untuk Sistem Operasi yang memungkinkan Anda untuk melakukan penguncian antar-proses dan sinkronisasi (IPC).


95

lockadalah kata kunci penyusun, bukan kelas atau objek aktual. Ini adalah pembungkus di sekitar fungsionalitas Monitorkelas dan dirancang untuk Monitormemudahkan pekerjaan dengan kasus umum.

The Monitor(dan lockkata kunci), seperti yang Darin mengatakan, terbatas pada AppDomain. Terutama karena referensi ke alamat memori (dalam bentuk objek instantiated) diperlukan untuk mengelola "kunci" dan mempertahankan identitasMonitor

The Mutex, di sisi lain, adalah Net bungkus sekitar sistem operasi membangun, dan dapat digunakan untuk seluruh sistem sinkronisasi, menggunakan tali Data (bukan pointer ke data) sebagai identifier-nya. Dua mutex yang mereferensikan dua string dalam dua alamat memori yang sama sekali berbeda, tetapi memiliki data yang sama , sebenarnya akan menggunakan mutex sistem operasi yang sama.


54

A Mutexdapat berupa lokal untuk suatu proses atau seluruh sistem . MSDN :

Mutex terdiri dari dua jenis: mutex lokal, yang tidak disebutkan namanya, dan dinamai sistem mutex. Mutex lokal hanya ada dalam proses Anda.

Selain itu, orang harus berhati-hati - dirinci pada halaman yang sama juga - ketika menggunakan sistem mutex seluruh sistem dengan Layanan Terminal.

Salah satu perbedaan antara Mutexdan lockadalah yang Mutexmenggunakan konstruksi tingkat kernel , sehingga sinkronisasi akan selalu memerlukan setidaknya transisi ruang-ruang kernel pengguna.

lock- yang benar-benar merupakan jalan pintas ke Monitorkelas , di sisi lain mencoba untuk menghindari mengalokasikan sumber daya kernel dan beralih ke kode kernel (dan karenanya lebih ramping & lebih cepat - jika seseorang harus menemukan konstruksi WinAPI yang menyerupai, itu akan menjadi CriticalSection).

Perbedaan lainnya adalah apa yang orang lain tunjukkan: nama Mutex dapat digunakan lintas proses.

Kecuali jika seseorang memiliki kebutuhan khusus atau memerlukan sinkronisasi antar proses, lebih baik tetap berpegang pada lock(alias Monitor) ˛

Ada beberapa perbedaan "kecil" lainnya, seperti cara penanganan pengabaian, dll.

Hal yang sama dapat dikatakan tentang ReaderWriterLockdan ReaderWriterLockSlimdi 3.5, Semaphoredan yang baru SemaphoreSlimdi. NET 4.0 dll. Memang benar bahwa xxSlimkelas yang terakhir tidak dapat digunakan sebagai primitif sinkronisasi seluruh sistem, tetapi mereka tidak pernah dimaksudkan untuk - mereka "hanya" dimaksudkan menjadi lebih cepat dan lebih ramah sumber daya.


25

Saya menggunakan Mutex untuk memeriksa apakah saya sudah memiliki salinan aplikasi yang berjalan di mesin yang sama.

bool firstInstance;
Mutex mutex = new Mutex(false, @"Local\DASHBOARD_MAIN_APPLICATION", out firstInstance);

if (!firstInstance)
{
    //another copy of this application running 
}
else
{
    //run main application loop here.
}
// Refer to the mutex down here so garbage collection doesn't chuck it out.
GC.KeepAlive(mutex);

8

Banyak yang sudah dikatakan, tetapi untuk membuatnya sederhana, ini pendapat saya.

lock -> Mudah digunakan, terbungkus monitor, mengunci utas di AppDomain.

mutex tanpa nama -> mirip dengan penguncian kecuali ruang lingkup penguncian lebih dan itu melintasi AppDomain dalam suatu proses.

Bernama mutex -> ruang lingkup penguncian bahkan lebih dari mutex yang tidak disebutkan namanya dan itu melintasi proses dalam sistem operasi.

Jadi sekarang ada pilihan, Anda harus memilih yang paling cocok dalam kasus Anda.


Seperti yang saya mengerti dari jawaban dan contoh untuk mutex di sini msdn.microsoft.com/en-us/library/… : mutex yang tidak disebutkan namanya bertindak sama dengan kunci. Namun mutex.WaitOne (1000) memberi kita kesempatan untuk mematikan kunci. Di sisi lain, Monitor.TryEnter juga memberi kita kemampuan itu. Seperti disebutkan, Mutex adalah pembungkus. Jadi saya akan menggunakan kunci atau Monitor alih-alih mutex yang tidak disebutkan namanya. Tetapi jika ada kunci di proses yang diperlukan, mutex bernama adalah cara untuk pergi. Tolong koreksi saya jika saya salah.
Koray

6

Mutex adalah proses lintas dan akan ada contoh klasik untuk tidak menjalankan lebih dari satu instance aplikasi.

Contoh ke-2 adalah mengatakan Anda memiliki file dan Anda tidak ingin proses yang berbeda untuk mengakses file yang sama, Anda dapat menerapkan Mutex tetapi ingat satu hal Mutex adalah sistem operasi yang luas dan tidak dapat digunakan antara dua proses jarak jauh.

Kunci adalah cara paling sederhana untuk melindungi bagian dari kode Anda dan itu spesifik appdomain, Anda dapat mengganti kunci dengan Moniter jika Anda ingin sinkronisasi yang lebih terkontrol.


1

Beberapa perbedaan kecil yang tidak disebutkan dalam jawaban:

  1. Dalam hal menggunakan kunci, Anda dapat yakin bahwa kunci akan dilepaskan ketika pengecualian terjadi di dalam blok kunci.
    Itu karena kunci menggunakan monitor di bawah tenda dan dilaksanakan dengan cara ini :

     object __lockObj = x;
     bool __lockWasTaken = false;
     try
     {
         System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
         // Your code...
     }
     finally
     {
         if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
     }

    Jadi, bagaimanapun, kunci dilepaskan, dan Anda tidak perlu melepaskannya secara manual (seperti yang akan Anda lakukan untuk mutex).

  2. Untuk Kunci, Anda biasanya menggunakan objek pribadi untuk mengunci (dan harus menggunakan ).
    Ini dilakukan karena berbagai alasan. (Info lebih lanjut: lihat jawaban ini dan dokumentasi resmi ).

Jadi, jika ada kunci, Anda tidak dapat (secara tidak sengaja mendapatkan) akses ke objek yang dikunci dari luar dan menyebabkan kerusakan.
Tetapi dalam hal Mutex, Anda dapat, karena memiliki Mutex yang umum dan digunakan dari mana saja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.