Program Sinkronisasi Dengan Semafor

108 109 mutex.buka; 110 } 111 Pada fungsi tersebut tiap-tiap thread akan mengakses critical section secara bergantian, sesuai dengan prinsip mutual exclusion . Di dalam critical section , thread-thread akan dicek apakah truePemaintelapak atau falsePemainpunggung kemudian dihitung berapa jumlah telapak dan punggungnya. Proses ini akan terus me-loop sampai ada pemenang. Sebelum memasuki critical section dan melakukan pengecekan, sistem melakukan proses sinkronisasi bandar dan pemain, dengan memangil fungsi syncBandarPemain Contoh 27.4. syncBandarPemain 155 private void syncBandarPemainint ii 156 { 157 bandar[ii].buka; 158 pemain[ii].kunci; 159 } 160 dalam fungsi tersebut bandar melepaskan kunci, dan memanggil thread pemain dengan notify yang merupakan bagian dari fungsi buka dari class Semafor, untuk kemudian thread tersebut dapat mengakses critical section. Setelah seluruh thread pemain mengakses critical section dan melakukan pengecekan, program memanggil fungsi bandarGambreng pada class Gambreng,untuk melakukan proses sinkronisasi bandar yaitu memanggil fungsi syncBandar Contoh 27.5. syncBandar 141 private void syncBandar 142 { 143 forint ii=0;iijumlahPemain;ii++ 144 { 145 bandar[ii].kunci; 146 } 147 } , sehingga bandar terkunci dalam critical section dan memegang kekuasaan dalam Gambreng untuk melakukan perulangan fungsi-fungsi berikut, yang masing-masing akan dipanggil dalam fungsi bandarGambreng : 1. Me-reset permainan gambreng dengan memanggil fungsi resetGambreng . Contoh 27.6. resetGambreng 100 public void resetGambreng 101 { 102 mutex.kunci; 103 adaPemenang=false; 104 truePemain=0; 105 trueCount=0; 106 falsePemain=0; 107 falseCount=0; 201 108 109 mutex.buka; 110 } 111 Dalam fungsi resetGambreng , truePemain , falsePemain , trueCount dan falseCount = 0, kemudian ada pemenang diset false, sebagai tanda awal dari permainan. 2. Melakukan sinkronisasi pemain dan bandar dengan memanggil fungsi syncPemainBandar . Contoh 27.7. syncPemainBandar 132 private void syncPemainBandar 133 { 134 forint ii=0; iijumlahPemain;ii++ 135 { 136 pemain[ii].buka; 137 bandar[ii].kunci; 138 } 139 } Ketika melakukan pemanggilan fungsi ini, seluruh pemain dibangunkan kemudian tiap-tiap bandar akan tidur. Dengan fungsi ini, bandar akan tetap menunggu sampai semua pemain membangunkannya. Dan ketika bandar bangun, pemain akan ditidurkan kembali. 3. Melakukan penghitungan dengan fungsi hitungGambreng Contoh 27.8. hitungGambreng 116 private void hitungGambreng 117 { 118 mutex.kunci; 119 120 iftrueCount==1 121 { 122 adaPemenang=true; 123 nomorPemenang=truePemain; 124 } 125 else 126 { 127 adaPemenang=true; 128 nomorPemenang=falsePemain; 129 } 130 mutex.buka; 131 } Dengan fungsi ini, kembali melakukan pengaksesan variable. Dengan melakukan pengecekan, apabila salah satu diantara trueCount atau falseCount bernilai 1, maka adaPemenang. Nilai ini akan diproses oleh fungsi menangGambreng , yang akan mengembalikan nilai booleantrue atau false. Jika fungsi tersebut bernilai true maka proses loop berhenti. 4. Menghitung iterasi perulangan, sampai fungsi menangGambreng mengembalikan nilai true, yang menandakan adanya pemenang. Saat proses perulangan berhenti, pemain melepaskan kunci kemudian sistem menampilkan output saat execute, berupa no_pemain yang keluar sebagai pemenang. Setiap proses execute akan menampilkan nomor pemain yang berbeda-beda , karena proses random dan urutan pengaksesan critical section oleh thread pada tiap peng- execute-an berbeda-beda. 202 Contoh 27.9. Keluaran Program Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[12] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[2] Jumlah Iterasi[1] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[0] Jumlah Iterasi[6] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[4] Jumlah Iterasi[2] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[1] Jumlah Iterasi[14] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[9] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[5] Jumlah Iterasi[3] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[3] Jumlah Iterasi[2] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[4] Jumlah Iterasi[5] Nomor Peserta Pemain [0] - [5] Pemenang Pemain nomor[0] Jumlah Iterasi[11] Contoh di atas menunjukkan hasil Hompimpah tidak selalu sama. Jumlah iterasi menunjukkan berapa kali bandar menyerukan gambreng dan mengulang permainan.

27.5. Rangkuman

Program Hompimpah merupakan ilustrasi dimana sebuah thread memegang kendali sinkronisasi thread lainnya. Seperti yang dijelaskan dalam program masing-masing dari pemain saling mengendalikan satu sama lain, dengan menggunakan alat sinkronisasi yang bernama semafor. Semafor dalam program adalah semafor buatan berupa class Semafor yang dibuat dalam bahasa Java. Adapun di dalamnya terdapat 2 fungsi yaitu fungsi buka dan fungsi kunci dengan fungsi-fungsi inilah masing-masing thread dapat mengendalikan satu sama lain Rujukan [Silberschatz2005] Avi Silberschatz, Peter Galvin, dan Grag Gagne. 2005. Operating Systems Concepts. Seventh Edition. John Wiley Sons. 203 204