Anda di halaman 1dari 6

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

NAMA : ALISTYA FIKRI PRATONDO


NIM : 195150220111002
TUGAS : BAB 1
TANGGAL : 12/10/2020
ASISTEN : TIO SETIAWAN

4.5 Tugas
Tugas 1
Jalankan kode program berikut!
1.

soal.c
1 #include<stdio.h>
2 #include<string.h>
3 #include<pthread.h>
4 #include<stdlib.h>
5 #include<unistd.h>
6
7 int counter = 0;
8 pthread_t tid[4];
9
10 void* doSomeThing(void *arg) {
11 printf("\n Thread %d started, please wait...\n", counter);
12 counter++;
13
14 unsigned long i = 0;
15 for(i=0; i<(0xFFFFFFFF);i++);
16
17 printf("\n Thread %d finished\n", counter);
18
19 return NULL;
20 }
21
22 int main(void) {
23 int i;
24 for(i = 0; i < 4; i++)
25 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
26
27 for(i = 0; i < 4; i++)
28 pthread_join(tid[i], NULL);
29
30 return 0;
31 }

Bila anda berhasil menjalankan kode program tersebut, maka anda


akan mendapati output seperti pada gambar di bawah ini.
Jawablah pertanyaan berikut ini:
1. Mengapa perintah printf pada baris 11 pada masing-masing
thread menampilkan nilai counter yang berbeda?
Dikarenakan printf pada baris 12 sendiri terdapat perintah
counter++ yang mengakibatkan nilai counternya akan selalu
bertambah.

2. Mengapa pada semua thread perintah printf pada baris 17


menampilkan nilai Thread 4 finished?
Dikarenakan keempat thread ini berbagi nilai counter yang
sama yaitu 4. Saat keempat thread telah selesai dibuat, thread
pertama hingga terakhir masih berada pada loop yang sama.
Hal itu mengakibatkan keempatnya masuk ke dalam loop yang
sama, sehingga ketika berhenti nilai dari keempat thread ini
akan memiliki nilai counter yang sama.

3. Apa fungsi for pada baris 14? Berapa kali looping yang
dilakukan oleh perintah for tersebut?
For pada baris 14 sendiri berperan atau memiliki fungsi sebagai
salah satu penyebab keempat thread memiliki nilai counter yang
sama. For ini berfungsi untuk menjaga thread yang terbentuk
dalam kondisi running sambil memastikan thread yang lain
terbentuk terlebih dahulu sebelum looping selesai. Fungsi
lainnya yaitu untuk memberi jeda waktu antara ketika thread
dibuat dan thread berakhir.

Tugas 2

Modifikasilah kode program pada Tugas 1 dengan menambahkan


pthread_mutex_lock dan
pthread_mutex_unlock. Sehingga menghasilkan output seperti pada
gambar di bawah ini.

Jawablah pertanyaan berikut ini:


1. Jelaskan kode program hasil modifikasi anda? Jelaskan pula
alasan penempatan pthread_mutex_lock dan
pthread_mutex_unlock pada kode program hasil modifikasi
anda!

Saya memodifikasinya dengan melakukan penambahan di


baris ke-8 yaitu penambahan kode program “pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;”, kemudian
menambahkan setelah baris ke-10 yaitu kode program
“pthread_mutex_lock(&mutex1);”, dan yang terakhir
penambahan pada baris ke-18 yang berupa kode program
“ptread_mutex_unlock(&mutex1);”. Alasan penempatan kode
program pthread_mutex_lock di awal method doSomething()
dan kode program pthread_mutex_unlock di akhir method
doSomething() ialah agar sebuah thread dapat menyelesaikan
eksekusinya hingga akhir sebelum thread lain dapat
mengakses method tersebut.

2. Dari segi waktu eksekusi, bagaimanakah perbandingan


kecepatan eksekusi kode program pada Tugas 1 dengan
kode program hasil modifikasi anda pada Tugas 2? Jelaskan
alasannya!
Waktu pada eksekusi tugas 1

Waktu pada eksekusi tugas 2

Dari perbandingan waktu eksekusi yang terjadi antara


program di tugas 1 dan program di tugas 2 diketahui bahwa
program di tugas 1 memiliki waktu eksekusi lebih cepat. Hal
ini dikarenakan program pada tugas 2 terdapat perintah
pthread_mutex_lock dan pthread_mutex_unlock, jadi suatu
thread terpaksa menunggu thread lain menyelesaikan
eksekusinya, barulah giliran thread selanjutnya.

Tugas 3

Modifikasilah kode program pada Tugas 1 pada baris 24 s.d. 28 menjadi


soal.c
... ...
24
25 for(i = 0; i < 4; i++) {
26
pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
27
pthread_join(tid[i], NULL);
... ...
}

Jawablah pertanyaan berikut ini:


1. Tampilkan output kode program tersebut! Jelaskan dampak dari
modifikasi tersebut!

Dapat dilihat bahwa output kode program tersebut sama


dengan output kode program pada tugas 2. Hal ini dikarenakan
thread juga dibuat secara berurutan, dalam artian thead lain
akan menunggu thread yang sedang dieksekusi hingga selesai
terlebih dahulu. Jadi, itu artinya thread kedua akan dibuat
setelah thread pertama, thread ketiga setelah thread kedua, dan
seterusnya. Bedanya pada mutex, thread dibuat sekaligus tapi
dieksekusi secara bergantian sedangkan join dibuat setelah
suatu thread selesai dieksekusi.

2. Dari segi waktu eksekusi, bagaimanakah perbandingan


kecepatan eksekusi kode program pada Tugas 1, kode
program hasil modifikasi anda pada Tugas 2, dan kode
program pada Tugas 3? Jelaskan alasannya!
Waktu ekesekusi tugas 1:

Waktu eksekusi tugas 2:


Waktu eksekusi tugas 3:

Dapat dilihat untuk waktu eksekusi tercepatnya ada pada


program tugas 1, lalu yg kedua program tugas 2 dan terakhir
program tugas 3. Untuk waktu eksekusi antara program tugas 2
dan tugas 3 hanya berbeda beberapa detik, bahkan tidak
sampai 1 detik. Hal itu disebabkan karena looping yang terjadi
pada tugas 1 dilakukannya secara bersamaan. Sedangkan, jika
pada tugas dilakukan satu persatu sehingga waktu loopingnya
hampir sama dengan sebelumnya. Sedangkan, pada tugas 3
thread akan melakukan looping yang sama dan menghasilkan
waktu eksekusi looping yang sama. Jadi, perbedaan untuk
masing-masing waktu sendiri dilihat berdasarkan waktu thread
dibuat sampai berakhir dieksekusi.

Anda mungkin juga menyukai