Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk...

40
Sinkronisasi Proses Pertemuan ke 6

Transcript of Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk...

Page 1: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Sinkronisasi Proses

Pertemuan ke 6

Page 2: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Agenda Hari ini

Masalah Critical Section

Masalah Klasik dalam Sinkronisasi

Semaphores

Latar Belakang

Page 3: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

Page 4: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

(2) Berdoa, semoga ilmu yang didapat hari ini dapat mudah terserap dengan tetap menjaga sopan satun.

Page 5: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bersyukur dan berdoaMenurut kepercayaan dan agama masing-masing

(1) Bersyukur masih diberi kesempatan untuk belajar dan berbagi ilmu.

(2) Berdoa, semoga ilmu yang didapat hari ini dapat mudah terserap dengan tetap menjaga sopan satun.

(3)Berdoa, semoga bisa menyelesaikan pendidikan ini tepat waktu dan diwaktu yang tepat

Page 6: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

LATAR BELAKANG

Page 7: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

LATAR BELAKANG Akses-akses yang dilakukan secara bersama-sama ke

data yang sama, dapat menyebabkan data menjadi tidak konsisten

Untuk menjaga agar data tetap konsisten, dibutuhkan mekanisme-mekanisme untuk memastikan pemintaan ekseskusi dari proses yang bekerja.

Sinkronisasi merupakan “issue” penting dalam rancangan/implementasi OS (shared resources, data, dan multitasking).

Salah satu masalah yang dapat timbul bila tidak menerapkan sinkronisasi adalah Race Condition

Page 8: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Race Condition

※ Race Condition: Situasi yang tidak menentu akibat beberapa proses mengakses dan memanipulasi data secara bersamaan.

※ Nilai terakhir dari data bergantung dari proses mana yang selesai terakhir.

※ Untuk menghindari Race Condition, proses-proses secara bersamaan harus disinkronisasikan.

※ Contoh : Proses Transfer Uang

Page 9: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Critical Section Problem

Page 10: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Critical Section Problem• Sebagai gambaran, sebuah sistem mempunyai n

proses yang saling berbagi data.• Setiap proses punya segmen kode yang disebut

critical section, dimana shared data diakses.• Contoh : ketika producer/consumer mengakses

variabel counter.• Masalah : ketika satu proses menjalankan critical

section-nya, di saat bersamaan process lain tidak boleh mengakses critical-section-nya

Page 11: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Solusi Critical Section Problem• Mutual Exclusion. Jika proses Pi mengekseskusi

critical section nya, maka tidak ada proses lain yang dapat mengeksekusi critical section nya.

• Progress. Jika tidak ada proses yang mengeksekusi critical section nya dan terdapat beberapa proses yang akan memasuki critical section, maka pemilihan proses yang akan memasuki critical section berikutnya tidak dapat ditunda tanpa batas

• Bounded Waiting. Ada batasan waktu tunggu ketika proses diizinkan untuk memasuki critical section setelah proses membuat permintaan untuk memasuki crit ical section dan sebelum permintaan yang diberikan.

Page 12: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual Exclusion• Mutual exclusion (mutex) adalah metode yang

digunakan untuk mencegah terjadinya inkonsitensi data sebagai akibat dari race condition.

• Untuk lebih mudah memahami mutex dan race condition, perhatikan kode berikut

Page 13: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual Exclusion

1. Sintaks #include<pthread.h> pada baris ke-5 adalah file header untuk mengakses POSIX thread library.

2. Baris 24 pthread_create() digunakan untuk membuat thread baru.

3. Function tambah pada baris ke 10 s/d 19 adalah aktifitas dari thread yang barusan dibuat atau thread T0.

4. Baris 33 yaitu pthread_join() digunakan untuk menunggu thread T0 selesai dieksekusi.

5. Ada variable global bernama bilangan yang awalnya bernilai nol (0).

6. Baris 26 s/d 31 variabel bilangan ditambah satu sampai bilangan bernilai 20.

7. Baris 12 s/d 17 variabel bilangan juga ditambah satu sampai bilangan bernilai 20.

8. Jadi seharusnya variable bilangan bernilai 40. Tetapi mengapa saat dieksekusi variable bilangan hanya bernilai 20 ?

Page 14: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual ExclusionHasil Compile :

Mengapa variable bilangan tidak berjumlah 40 (karena ada 2 buahperulangan FOR LOOP sebanyak 40x) tetapi hanya 20 ?Karena penggunaan thread tersebut secara tidak aman/benar sehingga hasilnya sulit diprediksi. Thread 1 dan thread 2 saling berebut menggunakan variable BILANGAN sehingga hasil akhirnya (BILANGAN) menjadi sulit diprediksi. Kondisi ini disebut RACE CONDITION. Supaya hasilnya benar yaitu bilangan = 40 maka salah satu caranya adalah menggunakan MUTEX.

Page 15: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual ExclusionPada kasus kita, critical section adalah variable BILANGAN, maka untuk mencegah proses/thread berebutan hak akses terhadap variable BILANGAN (critical section) maka kita harus mengatur hak akses tersebut menggunakan mutex.Untuk melindungi bagian critical section terhadap hasil yang tidak dapat diprediksi maka harus digunakan mutex lock seperti ini:

pthread_mutex_t a_lock = PTHREAD_MUTEX_INITIALIZER;

Page 16: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual Exclusion

Page 17: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Mutual ExclusionHasil Compile :

Page 18: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Masalah Klasik Sinkronisasi

Page 19: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Permasalahan Klasik dalam Sinkronisasi

• Ada beberapa permasalahan klasik dalam sinkronisasi– Permasalahan Bounded-Buffer– Permasalahan Dining-Philosophers– Permasalahan Readers and Writers

Page 20: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bounded-BufferBounded-buffer Producer Consumer• Producer : memproduksi data dan dimasukkan ke

buffer• Consumer : Mengonsumsi/mengambil data dari

buffer• Kapasitas buffer dibatasi• Ada variabel counter pencatat jumlah data

sekarang. Counter bernilai awal 0 yang bertambah ketika data diproduksi dan berkurang jika data dikonsumsi

Page 21: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bounded-BufferProducer (P)

Costumer (C)

Page 22: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bounded-Buffer• Q : Jika counter = 5, berapa nilai counter setelah satu kali iterasi secara

concurrent ?

• counter++ dapat diimplementasikan dalam bahasa mesin sbb :– register1 = counter– register1 = register1 + 1– counter = register1

• counter-- dapat diimplementasikan dalam bahasa mesin sbb :– register2 = counter– register2 = register2 - 1– count = register2

Page 23: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Bounded-Buffer• Jika “counter = 5” dan producer-consumer dieksekusi secara concurrent maka urutan eksekusinya bisa jadi :

1. Producer eksekusi : register1 = counter {register1 = 5}2. Producer eksekusi : register1 = register1 + 1 {register1 = 6}3. Consumer eksekusi : register2 = counter {register2 = 5}4. Consumer eksekusi : register2 = register2 - 1 {register2 = 4}5. Producer eksekusi : counter = register1 {counter = 6 }6. Consumer eksekusi : counter = register2 {counter = 4}

• Nilai counter dapat bernilai 4 atau 6. Padahal seharusnya 5• Problem : race condition

Page 24: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Problem Dining Philosopers• Pada tahun 1965, Djikstra menyelesaikan

sebuah masalah sinkronisasi yang beliau sebut dengan dining philisophers problem.

• Dining philosophers dapat diuraikan sebagai berikut :

• Lima orang filosuf duduk mengelilingi sebuah meja bundar. Masing-masing filosof mempunyai sepiring sphagetti. Sphagetti-sphagetti tersebut sangat licin dan membutuhkan dua sumpit untuk memakannya. Diantara sepiring spageti terdapat satu sumpit.

Page 25: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Problem Dining Philosopers

Page 26: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Problem Dining Philosopers• Kehidupan para filosof terdiri dari tiga periode, yaitu berpikir,

lapar dan makan. • Ketika seorang filosof lapar, dia berusaha untuk mendapatkan

sumpit kiri dan sumpit kanan sekaligus. • Dia mengambil sumpitnya satu per satu. Begitu ia mendapat

sebuah sumpit, ia tidak akan melepaskannya. Jika ia hanya berhasil mengambil kurang dari 2 sumpit, maka ia akan menunggu sampai 2 sumpit diambil.

• Begitu dia mendapatkan 2 sumpit, maka dia akan makan mienya untuk sementara waktu dan kemudian meletakkan kedua sumpitnya.

• Kedua sumpit ini kemudian dapat digunakan oleh filusuf-filusuf yang lain.

Page 27: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Problem Dining Philosopers• Pertanyaan kuncinya adalah, dapatkah masing-masing

philosophers tersebut melakukan prosesnya dengan benar dan tidak pernah mengalami kebuntuan. ada dua masalah yang di hadapi dining philosopher yaitu:

1. Deadlock 2. Starvation Philosopher i:

do {

wait(chopstick[i])

wait(chopstick[(i+1) % 5])

… eat

signal(chopstick[i]);

signal(chopstick[(i+1) % 5]);

… think

} while (1);

Page 28: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Problem Dining Philosopers• Solusi yang dilakukan adalah:

– Membolehkan max 4 filosof yang secara bersamaan duduk di meja makan

– Membolehkan filosof mengambil sumpit jika kedua sumpit tersedia

– Menggunakan penyelesaian asimetris. Filosof ganjil mengambil sumpit di kirinya baru kemudian yang kanan. Sementara filosof genap dengan cara sebaliknya.

Page 29: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Permasalahan Readers and Writers

• TUGAS– Jelaskan mengenai Permasalahan Readers

and Writers– Jelaskan apa masalahnya ?– Bagaimana solusinya ?– Solusi boleh dituliskan dalam bentuk

algoritma• Kerjakan di kertas A4

Page 30: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

Page 31: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

• Semaphore adalah counter atau penanda yang digunakan mengatur sinkronisasi saat proses atau thread sedang berbagi sumber daya yang sama pada saat yang sama.

• Semaphore memiliki 2 buah operasi :– Operasi Wait (nama lainnya: P (Proberen) atau Down atau Lock)– Operasi Signal (nama lainya: V (Verhogen) atau Up atau Unlock

atau Post)

Page 32: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

Cara Kerja :

• Saat Wait maka nilai counter berkurang 1. Jika counter bernilai negative maka proses/thread ini akan dipaksa berhenti (sleep). Proses/thread yang diberi operasi Wait akan dipaksa berhenti sampai proses/thread tersebut diberi tanda Signal. Jadi kalo counter lebih kecil dari 0 maka akan proses/thread akan diblok.

• Saat Signal maka nilai counter bertambah 1. Proses/thread yang diberi operasi/tanda Signal akan running dan harus berhenti jika diberi tanda Wait. Kalo proses/thread lebih besar atau sama dengan nol maka akan running (unblock)

Page 33: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana kedua proses men-berbagi sumber daya yang sama (variable bilangan). Jika tidak dilakukan sinkronisasi antara proses maka nilai variable bilangan menjadi tidak pasti (tidak stabil), misalnya: berapa nilai variable bilangan pada Gambar di bawah ini ?? Bilangan = 20 atau 40 ??

Page 34: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphorejika program di atas diimplementasi TANPA MENGGUNAKAN SEMAPHORE maka hasilnya tampak seperti Gambar di bawah ini

SEKARANG DICOBA MENGGUNAKAN SEMAPHORE !!!Dengan menggunakan semaphore maka anda dapat mengatur thread mana yang harus running terlebih dahulu sehingga kedua thread tidak berebutan menggunakan variable bilangan. Gambar sebelumnya dimodifikasi dengan menambahkan semaphore, hasilnya seperti gambar di bawah ini.

Page 35: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

SEKARANG DICOBA MENGGUNAKAN SEMAPHORE !!!

Dengan menggunakan semaphore maka anda dapat mengatur thread mana yang harus running terlebih dahulu sehingga kedua thread tidak berebutan menggunakan variable bilangan. Gambar sebelumnya dimodifikasi dengan menambahkan semaphore, hasilnya seperti gambar di bawah ini.

Page 36: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

Semaphore

Pada kasus ini, thread A & B mengetahui adanya semaphore "afandi" dan mau diatur oleh semaphore afandi. Mula-mula B akan dipaksa berhenti karena ada operasi Wait (nilai afandi yang awalnya bernilai nol akan dikurangi 1 sehingga = -1) sedangkan thread A langsung bekerja. Saat thread A selesai maka Sinyal(&afandi) akan membuat nilai "afandi" sama dengan 0 karena Sinyal membuat counter "afandi" bertambah 1 (sebelumnya bernilai -1). Setelah afandi bernilai 0, maka thread B akan bekerja.

Pada gambar, semaphore yang bernama "afandi" di inisial isasi (INIT(&afandi, 0) dengan memberi nilai nol. Semaphore "afandi" ini dishare antara kedua thread. Artinya thread A & B sama2 mengetahui semaphore ini dan penggunaannya.

PENTING !!!: Semaphore harus dishare diantara proses/thread yang terlibat dalam komunikasi kalo tidak maka anda tidak dapat melakukan sinkronisasi antar proses/thread tersebut

Page 37: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

implementasi semaphore#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<errno.h>

#include<pthread.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <string.h>

int bilangan = 0; // VARIABEL GLOBAL YANG DISHARE BERSAMA ANTARA

// THREAD 1 DAN THREAD TAMBAH

pthread_t T0;

int afandi; /* variabel semaphore */

// FUNCTION DARI SEMAPHORE

void sem_p(int id, int value){ // untuk ganti nilai semaphore dengan -1 atau 1

struct sembuf sem_b;

int v;

sem_b.sem_num = 0;

sem_b.sem_op = -1; /* P() */

sem_b.sem_flg = SEM_UNDO;

if (semop(id, &sem_b, 1) == 1)

fprintf(stderr, "\nError...Semaphore P Decrement Gagal");

}

Page 38: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

void sem_v(int id, int value){ // untuk ganti nilai semaphore dengan -1 atau 1

struct sembuf sem_b;

int v;

sem_b.sem_num = 0;

sem_b.sem_op = 1; /* V() */

sem_b.sem_flg = SEM_UNDO;

if(semop(id, &sem_b, 1) == -1)

fprintf(stderr, "\nError...Semaphore V Increment Gagal");

}

void sem_create(int semid, int initval){

int semval;

union semun {

int val;

struct semid_ds *buf;

unsigned short *array;

} s;

s.val = initval;

if((semval = semctl(semid, 0, SETVAL, s)) < 0)

fprintf(stderr,"\nsemctl error....");

}

void sem_wait(int id){ // Decrement P

int value = -1;

sem_p(id, value);

}

void sem_signal(int id){ // Increment V

int value = 1;

sem_v(id, value);

}

// END FUNCTION SEMAPHORE

Page 39: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana

// THREAD

void *tambah(void *a) {

int i,j;

sem_wait(yosua);

for (i = 0; i < 20; i++) {

j = bilangan;

j++;

sleep(1);

bilangan = j;

}

return NULL;

}

int main() {

int i,j;

printf("Nilai Bilangan Awal = %i\n", bilangan);

// BUAT SEMAPHORE "afandi"

if((yosua = semget(IPC_PRIVATE, 1, 0666|IPC_CREAT)) == -1){

printf("\nError... Tidak bisa buat semaphore afandi");

exit(1);

}

sem_create(afandi, 0);

if(pthread_create(&T0, NULL, tambah, NULL)==-1)

error("thread tidak bisa dibuat");

// THREAD INI YANG RUNNING DULUAN KEMUDIAN THREAD TAMBAH

for ( i=0; i<20; i++) {

j = bilangan;

j++;

sleep(1);

bilangan = j;

}

sem_signal(afandi);void* result;pthread_join(T0, &result);printf("Nilai Bilangan Akhir = %i\n", bilangan);return 0;}

Page 40: Sinkronisasi Proses...Contoh kasus 1 menjelaskan bagaimana cara menggunakan semaphore untuk melakukan sinkronisasi antar proses. Anggap ada 2 proses yaitu Proses A dan Proses B, dimana