Anda di halaman 1dari 24

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

NAMA : ELISABETH AGUSTINA


NIM : 195150301111024
TUGAS : BAB 4
TANGGAL : 30/03 /2021
ASISTEN : BAMBANG GUNAWAN TANJUNG
NOBEL EDGAR

4.4. Langkah Praktikum

4.4.1 Mutex
main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4
5 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
6 int counter = 0;
7
8 void *increase() {
9 pthread_mutex_lock( &mutex1 );
10 int i;
11 for(i=0; i<99999; i++) {
12 counter++;
13 printf("Counter value: %d\n",counter);
14 }
15 pthread_mutex_unlock( &mutex1 );
16 }
17
18 void *decrease() {
19 pthread_mutex_lock( &mutex1 );
20 int i;
21 for(i=0; i<99999; i++) {
22 counter--;
23 printf("Counter value: %d\n",counter);
24 }
25 pthread_mutex_unlock( &mutex1 );
26 }
27
28 main() {
29 int rc1, rc2;
30 pthread_t thread1, thread2;
31
32 /* Create independent threads each of which will execute increase */
33 if( (rc1=pthread_create( &thread1, NULL, &increase, NULL)) ) {
34 printf("Thread creation failed: %d\n", rc1);
35 }
36
37 /* Create independent threads each of which will execute decrease */
38 if( (rc2=pthread_create( &thread2, NULL, &decrease, NULL)) ) {
39 printf("Thread creation failed: %d\n", rc2);
40 }
41
42 /* Wait till threads are complete before main continues. Unless we */
43 /* wait we run the risk of executing an exit which will terminate */
44 /* the process and all threads before the threads have completed. */
45 pthread_join( thread1, NULL);
46 pthread_join( thread2, NULL);
47
48 exit(EXIT_SUCCESS);
49 }

1. Jalankan program tersebut sebanyak 10 kali. Apakah semua


output yang dihasilkan sama?
Tips: Anda dapat menyimpan output program ke dalam file text
dengan cara menambahkan > namafile.txt di akhir perintah,
misal: ./main > output1.txt

Dari hasil percobaan tersebut outputnya adalah sama.


2. Hapus kode program pada baris 9, 15, 19, dan 25 yang berisi
perintah pthread_mutex_lock dan
pthread_mutex_unlock. Kemudian jalankan program
tersebut sebanyak 10 kali. Apakah semua output yang
dihasilkan sama?
Dari percobaan tersebut hasil output nya berbeda dari setiap
percobaan.
3. Berdasarkan hasil pengamatan anda, simpulkanlah fungsi dari
pthread_mutex_lock dan pthread_mutex_unlock dalam
program tersebut!

 Pthread_mutex_lock() – digunakan untuk mengunci


suatu variabel. Jika mutex sudah di-lock oleh suatu thread,
maka thread lain tidak bisa memanggil fungsi ini sampai
mutex tersebut sudah di-unlock.
 Pthread_mutex_unlock() – digunakan untuk membuka
kunci suatu variabel. Pesan error akan muncul jika suatu
thread memanggil fungsi ini padahal bukan thread tersebut
yang mengunci mutex.
4.4.2 Join
main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4
5 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
6 int counter = 0;
7
8 void *increase() {
9 pthread_mutex_lock( &mutex1 );
10 int i;
11 for(i=0; i<99999; i++) {
12 counter++;
13 printf("Counter value: %d\n",counter);
14 }
15 pthread_mutex_unlock( &mutex1 );
16 }
17
18 void *decrease() {
19 pthread_mutex_lock( &mutex1 );
20 int i;
21 for(i=0; i<99999; i++) {
22 counter--;
23 printf("Counter value: %d\n",counter);
24 }
25 pthread_mutex_unlock( &mutex1 );
26 }
27
28 main() {
29 int rc1, rc2;
30 pthread_t thread1, thread2;
31
32 /* Create independent threads each of which will execute increase */
33 if( (rc1=pthread_create( &thread1, NULL, &increase, NULL)) ) {
34 printf("Thread creation failed: %d\n", rc1);
35 }
36
37 /* Create independent threads each of which will execute decrease */
38 if( (rc2=pthread_create( &thread2, NULL, &decrease, NULL)) ) {
39 printf("Thread creation failed: %d\n", rc2);
40 }
41
42 /* Wait till threads are complete before main continues. Unless we */
43 /* wait we run the risk of executing an exit which will terminate */
44 /* the process and all threads before the threads have completed. */
45 pthread_join( thread1, NULL);
46 pthread_join( thread2, NULL);
47
48 exit(EXIT_SUCCESS);
49 }

Berdasarkan output dari program tersebut, jawablah pertanyaan berikut:

1. Jalankan program tersebut sebanyak 10 kali. Apakah semua


output yang dihasilkan sama?
2. Hapus kode program pada baris 22, 23, dan 24 yang beris
looping perintah pthread_join. Kemudian jalankan program
tersebut sebanyak 10 kali. Apakah semua output yang dihasilkan
sama?

Dari percobaan ini semua output yang dihasilkan adalah berbeda.


4.4.3 Condition Variable

main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4
5 int count = 0;
6 pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
7 pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
8
9 // Write numbers 1-3 and 8-10 as permitted by functionCount2()
10 void *functionCount1() {
11 for(;;) {
12 // Lock mutex and then wait for signal to relase mutex
13 pthread_mutex_lock( &count_mutex );
14
15 // Wait while functionCount2() operates on count
16 // mutex unlocked if condition varialbe in functionCount2() signaled.
17 pthread_cond_wait( &condition_var, &count_mutex );
18 count++;
19 printf("Counter value functionCount1: %d\n",count);
20
21 pthread_mutex_unlock( &count_mutex );
22
23 if(count >= 10)
24 return(NULL);
25 }
26 }
27
28 // Write numbers 4-7
29 void *functionCount2(){
30 for(;;) {
31 pthread_mutex_lock( &count_mutex );
32
33 if( count < 3 || count > 6 ) {
34 // Condition of if statement has been met.
35 // Signal to free waiting thread by freeing the mutex.
36 // Note: functionCount1() is now permitted to modify "count".
37 pthread_cond_signal( &condition_var );
38 } else {
39 count++;
40 printf("Counter value functionCount2: %d\n",count);
41 }
42
43 pthread_mutex_unlock( &count_mutex );
44
45 if(count >= 10)
46 return(NULL);
47 }
48 }
49
50 main(){
51 pthread_t thread1, thread2;
52 pthread_create( &thread1, NULL, &functionCount1, NULL);
53 pthread_create( &thread2, NULL, &functionCount2, NULL);
54 pthread_join( thread1, NULL);
55 pthread_join( thread2, NULL);
56 printf("Final count: %d\n",count);
57 exit(EXIT_SUCCESS);
58 }
Berdasarkan output dari program tersebut, jawablah pertanyaan berikut:

1. Jalankan program tersebut. Apakah semua output yang


dihasilkan sama?

Output yang dihasilkan adalah sama

2. Hapus kode program pada baris 17 yang berisi perintah


pthread_cond_wait. Kemudian jalankan program tersebut.
Apakah semua output yang dihasilkan sama dengan output
pada soal 1?

Output yang dihasilkan adalah sama dengan no 1

3. Kembalikan (undo) kode program seperti saat anda


mengerjakan soal 1, kemudian hapus kode program pada baris
37 yang berisi perintah pthread_cond_signal.
Kemudian jalankan program tersebut. Apakah semua output
yang dihasilkan sama dengan output pada soal 1?
Output yang dihasilkan berbeda dengan nomor 1, karena
hasilnya berupa kosongan dan program menahan diri.

4. Berdasarkan hasil pengamatan anda setelah mengerjakan soal


1 s.d. 3, simpulkanlah fungsi dari pthread_cond_wait dan
pthread_cond_signal dalam program tersebut!

Untuk fungsi dari pthread_cond_wait, ia berfungsi agar


thread 1 menunggu thread 2 yang akan dieksekusi selanjutnya.
Kemudian setelah thread 2 selesai memproses baru thread 1
akan kembali melanjutkan prosesnya.

Fungsi dari pthread_cond_signal, ia akan mengizinkan


thread 1 untuk berjalan. Namun jika pthread tersebut dihapus
maka thread 1 tidak akan berjalan maka dari itu program akan
berhenti.
4.5 Tugas

Tugas 1
Jalankan kode program berikut!

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?

Karena counter yang dihasilkan adalah dari incrementnya, dan


pada kode 11 ini keempat thread menjalankannya hampir
bersamaan, sehingga nilai counter pun menghasilkan nilai yang
berbeda-beda sesuai urutan thread dibuat.

2. Mengapa pada semua thread perintah printf pada baris 17


menampilkan nilai Thread 4 finished?

Variabel count merupakan variabel global. Pada kode ini,


prosesnya tidak dilakukan sinkronasi sehingga thread ke 0
sampai thread ke 3 itu selesai maka thread tersebut akan
menambahkan isi dari variable countnya sehingga variabel count
hanya bisa membaca jumlah count terakhir yaitu 4. Maka dari
itu, output dari program tersebut adalah Thread 4 finished
sejumlah 4 kali.

3. Apa fungsi for pada baris 14? Berapa kali looping yang
dilakukan oleh perintah for tersebut?

Fungsi dari for tersebut adalah memberikan nilai delay (waktu


tunggu) untuk memastikan bahwa semua thread telah selesai
dibuat baru menjalankan kode berikutnya. Jumlah looping yang
dilakukan adalah sampai semampu batas memori komputer
yang kita miliki.

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.
1. Jelaskan kode program hasil modifikasi anda? Jelaskan pula
alasan penempatan pthread_mutex_lock dan
pthread_mutex_unlock pada kode program hasil modifikasi anda!

Alasan agar bisa membatasi dan mengunci thread yang


akan dibuat.

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!
Perbandingan kecepatan dari tugas 1 dan tugas 2 adalah
proses nya lebih cepat dibandingkan dengan proses tugas
nomor 2

Tugas 3

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

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

1. Tampilkan output kode program tersebut! Jelaskan dampak dari


modifikasi tersebut!
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!

Dibandingkan dengan proses tugas 1,tugas 2, dan tugas 3


bahwa kecepatan dalam mengeksekusi proses lebih cepat
proses eksekusi dari tugas 2 dibandingkan dengan tugas 1
dan tugas 3. Dan tugas 3 proses eksekusinya lebih lama
karena jumlah thread yang dihasilkan 2x lebih banyak dari
thread tugas 1 dan tugas 2 sebelumnya oleh sebab itu
waktu yang dibutuhkan pun hampir 2x dari tugas-tugas
sebelumnya

Anda mungkin juga menyukai