BAB 4
SIKRONISASI
4.3.2. Mutex
Mutex digunakan untuk menghindari ketidakkonsistenan data
karena sebuah variabel yang dimodifikasi oleh banyak thread dalam
waktu yang bersamaan. Hal ini menyebabkan terjadinya apa yang
disebut dengan race condition. Oleh karena itu, setiap ada variabel
global yang bisa dimodifikasi oleh banyak thread, digunakan mutex
untuk menjaga agar variabel global tersebut dimodifikasi oleh banyak
threads dengan suatu urutan tertentu. Mutex berfungsi seperti lock and
key, di mana jika suatu thread memodifikasi suatu variabel global, maka
variabel tersebut hanya bisa dimodifikasi oleh thread lainnya setelah
thread sebelumnya selesai memodifikasi variabel tersebut. Mutex ini
hanya bisa digunakan oleh thread-thread yang berasal dari satu proses
Modul Praktikum Sistem Operasi
2020/2021
4.3.3. Join
Sebuah join digunakan jika diinginkan suatu keadaan sebuah thread
baru akan berjalan setelah suatu thread lain selesai dijalankan. Sebuah
thread dapat juga menjalankan suatu rutin yang menciptakan banyak
thread baru di mana thread induk akan dijalankan lagi saat banyak
thread baru tersebut sudah selesai dijalankan.
• Pthread_create() – membuat sebuah thread baru
• Pthread_join() – menunggu termination dari suatu thread lain
• Pthread_self() – mengembalikan nilai identifier dari thread yang
sekarang dijalankan
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 void *decrease() {
18 pthread_mutex_lock( &mutex1 );
19 int i;
20 for(i=0; i<99999; i++)
21 { counter--;
22 printf("Counter value: %d\n",counter);
23 }
24 pthread_mutex_unlock( &mutex1 );
25 } main()
26 { int rc1,
27 rc2;
28 pthread_t thread1, thread2;
29
30 /* Create independent threads each of which will execute increase
31 */ if( (rc1=pthread_create( &thread1, NULL, &increase, NULL)) )
32 { printf("Thread creation failed: %d\n", rc1);
33 }
34 /* Create independent threads each of which will execute decrease
35 */ if( (rc2=pthread_create( &thread2, NULL, &decrease, NULL)) )
36 { printf("Thread creation failed: %d\n", rc2);
37 }
38 /* Wait till threads are complete before main continues. Unless we */
39 /* wait we run the risk of executing an exit which will terminate
40 */ /* the process and all threads before the threads have
41 completed. */ pthread_join( thread1, NULL);
42 pthread_join( thread2, NULL);
43
44 exit(EXIT_SUCCESS);
45 }
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?
3. Berdasarkan hasil pengamatan anda, simpulkanlah fungsi dari
pthread_mutex_lock dan pthread_mutex_unlock dalam program
tersebut!
4.4.2. Join
main.c
1 #include <stdio.h>
2 #include <pthread.h>
3
4 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
5 int counter = 0;
6
7 void *thread_function(void *dummyPtr)
8 { pthread_mutex_lock( &mutex1 );
9 counter++;
10 pthread_mutex_unlock( &mutex1 );
11 }
12 main()
13 {
14 pthread_t thread_id[100];
15 int i, j;
16
17 for(i=1; i <= 100; i++)
18 { printf("Create thread %d\n", i);
19 pthread_create( &thread_id[i], NULL, thread_function,
20 NULL ); }
21 for(j=1; j <= 100; j++) {
22 pthread_join( thread_id[j], NULL);
23 }
24 /* Now that all threads are complete I can print the final result. */
25 /* Without the join I could be printing a value before all the threads
26 */ /* have been completed. */
27 printf("Final counter value: %d\n", counter); }
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 int main(void)
22 { int i;
23 for(i = 0; i < 4; i++)
24 pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
25
26 for(i = 0; i < 4; i++)
27 pthread_join(tid[i], NULL);
28
29 return 0;
30 }
Bila anda berhasil menjalankan kode program tersebut, maka anda akan
mendapati output seperti pada gambar di bawah ini.
Modul Praktikum Sistem Operasi
2020/2021
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); } ...
4.6. Kesimpulan
UNTUK DIPERHATIKAN
4.4.1 Mutex
1. Langkah 1
Modul Praktikum Sistem Operasi
2020/2021
2. Langkah 2
Modul Praktikum Sistem Operasi
2020/2021
3. Langkah 3
4.4.2 Join
1. Langkah 1
2. Langkah 2
3. Langkah 3
Dari hasil pengamatan program yang telah dibuat, maka kita bisa
menarik kesimpulan yaitu pada Langkah 2 jika kita menghilangkan
metode join maka setiap thread akan berjalan bersama dan hanya
mengantri pada critical section karena adanya mutex lock
sehingga final couner value yang di print bukan 100. Jika mutex
lock dihilangkan maka program juga akan berantakan
2. Langkah 2
Modul Praktikum Sistem Operasi
2020/2021
3. Langkah 3
Modul Praktikum Sistem Operasi
2020/2021
Saat fungsi signal dihilangkan pada Langkah ini, maka output yang
dikeluarkan hanya looping yang kosong tanpa ada output yang di
print dan prosesnya harus di hentikan.
4. Langkah 4
4.5 Tugas
Tugas 1
Modul Praktikum Sistem Operasi
2020/2021
3. Apa fungsi for pada baris 14? Berapa kali looping yang dilakukan oleh
perintah for tersebut?
Penggunaan looping yang ada disini diugnakan untuk memastikan
apakah thread dalam kondisi running sampai thread lainnya terbentuk
Tugas 2
Modul Praktikum Sistem Operasi
2020/2021
Tugas 3