• About
  • Contact
  • Sitemap
  • Privacy Policy

VISUAL C# No.43: Mengenal Mutual Exclusion (Mutex) dalam .NET dan C#


Mutex merupakan kepanjangan dari Mutual Exclusion. Mutex ini digunakan dalam pengaturan MultiThreading atau untuk mengatur agar hanya Instance tertentu yang bisa mengakses sebuah resource. Mutex ini sangat familiar di semua bahasa pemrograman. Untuk anda yang belum tahu garis besar atau sejarah Mutex, silahkan baca Mutex dari Wikipedia di sini (http://en.wikipedia.org/wiki/Mutual_exclusion)


Pada tutorial ini kita akan membahas panjang lebar Mutex dalam Framework .NET dan bahasa pemrograman C#.


Mutex class merupakan salah satu Class dari namespace “System.Threading” dalam .NET selain Monitor Class, Semaphore Class, Thread Class, WaitHandle Class dan lain - lain (seperti yang sudah dibahas pada tutorial sebelumnya).

Penggunaan Mutex Class memang memakan Resource yang lebih bila dibandingkan dengan Class yang lain dalam .NET, tapi memiliki keunggulan lebih seperti bisa digunakan dengan multiple “wait”, serta bisa digunakan dalam sinkronisasi Thread dalam Proses yang berbeda. Bingung?

Ketika sebuah ‘source’ diakses oleh beberapa Thread, maka system membutuhkan mekanisme sinkronisasi bahwa hanya SATU Thread yang dapat mengakses ‘source’ tersebut sedangkan Thread yang lain menunggu hingga Mutex direlease / Mutex suspended oleh Thread yang sedang mengakses.

Disinilah peran mutex.

Sebetulnya, Mutex itu sama seperti ‘process lock()’ yang sudah kita bahas pada tutorial sebelumnya, hanya saja Mutex ini dapat bekerja pada multiple proses. Ingat bahwa semua bahasa pemrograman modern mendukung Mutex secara native.

Lalu bagaimana penggunaan Mutex dalam .NET dan C#?

1.(Pertama) Buat sebuah ‘static instance Mutex object’. Nah, adakah yang lupa tentang ‘static’? Silahkan buka tutorial sebelumnya :)
2.(Kedua) Kita bisa me-Wrapping kode yang akan kita eksekusi diantara Mutex yang sudah kita buat.

Dalam Mutex, kita mengenal dua buah method yang akan sering kita gunakan dalam Mutext, yaitu:
WaitOne(); -> digunakan untuk menunggu Thread hingga merelease Mutex
ReleaseMutex(); -> digunakan untuk merelease Mutex

Mari kita mencoba membuat console application yang simple terlebih dahulu.


Lihat gambar 1:


Pada kode di atas, kita hanya mengecek, bila Mutex dengan nama “MediatutorialMutex” tidak ditemukan, maka kode akan membuat Mutex dengan nama tersebut. Bila ditemukan maka aplikasi hanya bisa diakses oleh singleinstance saja.

Mudah dipahami kan kodenya???

Lalu kemudian, bagaimana penggunaan WaitOne() dan ReleaseMutex()?

Mari kita menengok kembali kode pada tutorial sebelumnya. Berikut adalah kode dengan menggunakan Lock() keyword sebagai solusi atas ‘race condition’ dalam Threading.


Lihat, kita membuat object kemudian me-Lock() nya,
Nah, mari kita menggunakan Mutex untuk mengganti Lock() Keyword seperti pada kode di bawah ini:



Lihat, mudah bukan? Kita hanya perlu membuat Object Mutex baru, kemudian kita menggunakan WaitOne(); untuk menunggu dan ReleaseMutex(); untuk merelease Mutex yang sudah dibuat.

Lalu bagaimana cara menulis/membuat Mutex baru?

Ada beberapa cara membuat Mutex baru, sesuai dengan tata cara penulisan constuctor sebagai berikut:
A.Mutex MutexKu = new Mutex();
Ini adalah default penulisan Mutex.

B.Mutex MutexKu = new Mutex(Boolean);
Boolean value mengindikasikan apakah Mutex ini dimiliki oleh Thread yang memanggilnya. Boolean nantinya berisi true atau false, true berarti Thread yang membuat/memanggil –lah yang memiliki Mutex ini.
Contoh:
Mutex MutexKu = new Mutex(true);

C.Mutex MutexKu = new Mutex(Boolean, String);
String value merupakan nama dari Mutex yang bersangkutan. Dalam banyak keadaan, kita perlu menamai Mutex kita agar nanti mudah memanggilnya.
Contoh:
Mutex MutexKu = new Mutex(true, “MediatutorialMutex”);

D.Mutex MutexKu = new Mutex(Boolean, String, Boolean);
Boolean pada variable ketiga mengindikasikan apakah Thread yang memanggil/membuatnya memiliki hak akses kepemilikan terhadap Mutex tersebut.
Contoh:
Mutex MutexKu = new Mutex(true, “MediatutorialMutex”, out OwnMutex);

E.Mutex MutexKu = new Mutex(Boolean, String, Boolean, MutexSecurity);
MutexSecurity mengindikasikan tentang ‘access control security’ yang ingin ditambahkan pada Mutex yang sudah dibuat.
Untuk ‘MutexSecurity’ kita akan membahasnya lebih jauh pada tutorial yang lain.

KHUSUS UNTUK TIGA (3) POINT TERAKHIR yaitu Point C, D, dan E, bila error maka Mutex akan me-return beberapa Exceptions diantara adalah sebagai berikut:

IOException : Error yang terjadi pada internal Windows (win32 error).
UnauthorizedAccessException : Mutex dengan nama tertentu ada dan memiliki “access control security”, tetapi user tidak memiliki hak akses control terhadap Mutex tersebut.
WaitHandleCannotBeOpenedException : Mutex dengan nama tertentu tidak bisa dibuat, mungkin karena terdapat Mutex lain dengan nama yang sama.
ArgumentException : Nama dari Mutex melebihi batas maximum yang diizinkan (260 karakter).

Lalu, bagaimana penerapan Mutex?

Ada banyak hal penggunaan Mutex, kita akan memperagakan salah satu yang simple saja yaitu mencegah agar hanya satu program instance saja yang berjalan.

Nah, pernahkah anda melihat atau menemui saat mencoba membuka program A yang baru, tapi tidak bisa membuka program A baru karena sudah ada program A lain yang sedang running?

Biasanya tertulis alert “Sorry, another instance already running” atau sejenisnya,

Inilah peran dari Mutex tersebut. Mari kita coba membuat sebuah GUI, perhatikan, saya membuat sebuah GUI sederhana hanya dengan sebuah label yang bernama ‘label1’.

Lihat gambar 2:


Lihat kode berikut ini:


Dengan menggunakan kode di atas, maka saat program sudah running, bila kita akan membuka kembali program tersebut maka akan ada konfirmasi bahwa program sedang running.
Ada istilah yang baru dari kode di atas yaitu @”global\” dan GC (Garbage Collector).

Pada komputer yang berjalan pada “Terminal Services” , Mutex yang diberi sebuah nama dapat memiliki dua level visibility.
*Bila Mutex tersebut dinamai dengan nama yang ber-awalan ”Global\”, maka Mutex tersebut akan visible pada semua Terminal Server Session.
*Bila Mutex tersebut dinamai dengan awalan “Local\” , maka Mutex hanya akan visible pada terminal dimana Mutex tersebut dibuat.

Nah, Garbage Collector ini gunakanya untuk pengaturan alokasi dan rilis memory untuk software kita. Garbage Collector akan kita bahas pada tutorial lain :)

OK, akhirnya usai sudah tutorial tentang Mutex (Mutual Exclusion), semoga bermanfaat,
Salam,


J-Theme