Showing posts with label C#-Thread. Show all posts
Showing posts with label C#-Thread. Show all posts

Friday, March 6, 2015

Making Shared Resource for Threads using Mutex - C#

Postingan ini boleh dikatakan adalah lanjutan dari postingan mutex sebelumnya. Cuman di sini dipaparkan teknik yang agk advance dikit yaitu membuat variabel yang diakses oleh beberapa thread menggunakan mutex. Ok langsung saja buat project baru di visual studio 2010 :
Setelah masuk dimain program, buat class baru seperti terlihat di bawah :
Nah kelas myMutex diatas mempunyai dua biji variabel public yaitu sharedCount dan sharedMutex. Kedua variabel tersebut akan digunakan oleh 2 buah thread. sharedCount nilainya akan diubah-ubah oleh beberapa thread dan sharedMutex digunakan untuk menjaga sharedCount agar hanya dapat diakses oleh satu buah thread pada suatu selang periode tertentu. Kemudian tambahkan kelas thread pertama, kodenya seperti terlihat di bawah :
Seperti terlihat pada fungsi Go() dalam firstThread ini. Dia menambah nilai pada sharedCount. Dan sharedCount sendiri dijaga oleh sharedMutex (WaitOne & ReleaseMutex). Kemudian untuk kelas thread kedua :
Thread kedua ini sama saja dengan thread pertama, cuman di thread kedua nilai sharedCount dikurangi. Ok.. Selanjutnya implementasikan kedua kelas tersebut dalam fungsi main seperti terlihat di bawah :
Hasilnya :

Thursday, March 5, 2015

Basic Mutex dalam Thread - C#

MUTual EXclusion (MUTEX) fungsinya sama dengan fitur lock. Cuman dari segi kecepatan, lock lebih cepat 50x dibanding mutex. Kelebihan mutex sendiri adalah dapat bekerja pada beberapa proses sekaligus, makanya mutex dapat disebut juga computer-wide dan application-wide.  Untuk mengunci sesuatu kita menggunakan fungsi Mutex.waitOne() dan untuk merelease digunakan Mutex.ReleaseMutex().

Contoh penggunaan mutex :
Yaaaah.... cara kerja mirip dengan lock... Hasilnya :
Untuk detik pertama :
Detik berikutnya :
Dan yang terakhir :

Fitur "lock" dalam Thread - C#

Pada postingan ini akan diperlihatkan contoh program penggunaan fitur lock dalam thread C#. Secara sederhana, lock ini berfungsi untuk mengunci suatu variabel jika sedang digunakan oleh suatu thread, dan mencegah thread lain untuk menggunakan variabel tersebut sebelum thread yang pertama selesai menggunakannya. Ok,.. Pertama mari kita buat project baru dalam visual studio :
Kemudian tambahkan kode berikut dalam fungsi mainnya :
Pada 11 dibuat variabel boolean dengan nama status dan nilai true. Variabel ini digunakan oleh fungsi Go() seperti yang terlihat pada line 34. Pada line 12 dibuat variabel baru dengan nama _locker. Variabel inilah yang nantinya akan menggunakan fitur "lock", tapi pada contoh program diatas, variabel _locker ini masih belum digunakan. Terus pada fungsi Main, dibuat 2 biji thread t1, dan t2. t1 dan t2 tersebut sama-sama mengakses fungsi Go(). So ketika t1 dan t2 start, mereka akan menjalankan fungsi Go(). Di dalam fungsi Go() terlihat (pada line 32) bahwa variabel status dicek, klu true berarti akan diprint angka 0 sampai 16. Nah ketika t1 start, variabel status masih true, sehingga dia bisa masuk dalam blok if (line 34 - 43), ketika pas masuk, status diubah menjadi false, sehingga thread lain yang mengakses blok if tersebut akan dilewati saja klu nilainya false. Makanya pas thread ke-2 running, nilainya udah false, sehingga thread kedua ini tidak melakukan apa-apa dalam fungsi Go(). Hasilnya seperti terlihat di bawah :
Terlihat bahwa thread 2 tidak jalan karena status sudah menjadi false. Tapi thread kedua tersebut dapat jalan juga ketika sesaat sebelum thread 1 mengubah status menjadi false, thread kedua sudah running lebih dulu. Dan hal tersebut dapat dilakukan dengan cara program tersebut dirunning berkali-kali sampai thread 2 jalan. Hisoka nyobain dulu........................................................... Nah setelah lima kali dirunning akhirnya thread kedua bisa jalan juga :
Nah klu kyk gini, sifat dari program yang kita buat susah dikontrol kan yah... :D
So disini diperlihatkan penggunaan fitur lock. Lock ini kita aplikasikan ke dalam block if seperti terlihat di bawah :
Jika thread 1 menggunakan lock tersebut, maka thread 2 akan dibuat nunggu dulu sampai thread 1 selesai make _locker tersebut. Jadi hasilnya, thread 1 dan 2 akan selalu bergantian masuk ke dalam blok if. Setelah dirunning kurang lebih 57 kali, hasilnya tetap stabil seperti ini :

Terlihat ketika thread 1 masuk ke fungsi Go(), maka thread 2 di sleep/pause sementara waktu sampai thread 1 selesai. Dan pada saat thread 2 di sleep, alokasi memory yang digunakan lebih sedikit dari pada menggunakan looping while.

Sekian.... Semoga bermanfaat..... :-)


Saturday, February 28, 2015

Dasar Lambda Expression dalam Thread - C#

Lambda expression atau anonymous method adalah cara sederhana dalam "memulai" suatu thread baru. Misalkan dibuat thread baru yang belum menggunakan lambda expression :
Line 13 dan 14 adalah cara umum untuk memulai suatu thread. Jika menggunakan lambda expression :
Line ke 19 adalah bentuk lambda expressionnya. Hasil yang diperoleh :
Variasi lamda expression yang lain dapat dilihat pada line 23 - 24 dengan menggunakan fungsi print yang terdapat pada line 28 - 32 :
Hasil yang diperoleh :
Variasi ketiga :
Cuman variasi yang ketiga ini tidak melakukan apa-apa. Belum tau kenapa :-3. Sekalipun diubah menjadi :
Yang ini juga g' jalan :
Tapi jika dibuat dalam project yang baru :
Nah baru ada outputnya :
Heeemm... intinya semua variasi bisa dijalanin, cuman variasi yang ketiga ini baru bisa klu dibuat dalam project baru. Moga nanti bisa ketahuan masalahnya apa.... ;-)

Fitur "join" dalam thread

Di sini diperlihatkan program yang sederhana untuk menunjukkan penggunaan join dalam suatu thread. Seperti terlihat pada namanya, join berguna untuk menggabungkan suatu thread. Namun sebelum digabungkan, thread yang akan bergabung tersebut dieksekusi dulu sampai selesai. Ilustrasinya seperti terlihat di bawah:
Pada contoh program diatas, fitur join belum digunakan, oleh sebab itu, ketika thread t dieksekusi (t.Start()), maka console juga akan langsung memprint text "Thread t has ended", seperti terlihat :
Nah jika fitur t.join diidupin :
Karena fitur join udah aktif, berarti "hellow Hisoka..." akan diprint dulu sampai selesai baru "Thread t has ended" keluar. Hal tersebut seperti diutarakan diatas, bahwa thread dieksekusi dulu sampai selesai kemudian digabungkan dengan thread utama. Hasilnya seperti terlihat di bawah :

Untuk fitur-fitur yang lain dapat dipelajari dari :
www.albahari.com/threading/