THREADS
Pendahuluan
Salah satu tujuan penting dari pembentukan thread adalah untuk memungkinkan
eksekusi secara konkuren dan paralel. Dari sebuah program atau aplikasi, bisa jadi
terdapat banyak instruksi yang dapat dilakukan secara paralel tanpa mempengaruhi
instruksi yang lain.
Langkah awal sebelum penggunaan thread adalah memastikan apakah sebuah
program benar-benar membutuhkannya. Sebagai contoh, sebuah program dirancang
untuk membaca dan menampilkan berkas. Maka untuk program ini, bisa dibagi dalam
dua atau lebih thread yang berbeda, satu thread untuk membaca berkas, satu thread
lain untuk memperbarui tampilan dan mungkin satu thread lainnya untuk memantau
input pengguna melalui keyboard.
Dan perlu diperhatikan bahwa akan ada kasus ketika sebuah thread saling bergantung
satu dengan yang lainnya seperti pada kasus di atas. Jika aplikasi tersebut berupa
pengolah kata dimana ketika tombol karakter ditekan maka harus segera
diinformasikan ke thread lain untuk memperbaharui tampilan atau membuka menu
lain, ataupun menjalankan tindakan yang sesuai. Hal ini akan mempengaruhi hasil
akhir dari proses secara keseluruhan.
Tujuan dari pelaksanaan praktikum ini adalah untuk memberikan pemahaman praktis
bagaimana proses dengan beberapa threads dijalankan pada sistem operasi berbasis
linux. Serta juga menunjukkan bahwa pembentukan thread bisa menjadi penyebab
munculnya inkonsistensi hasil akhir dari sebuah proses jika thread tidak dijalankan
dengan benar.
Teori Pendukung
Thread dapat dikatakan merupakan bagian terkecil dari sebuah proses yang bisa
dieksekusi atau dijalankan. Satu proses bisa memiliki beberapa thread yang dapat
dieksekusi secara asinkron. Eksekusi asinkron ini membawa kemampuan setiap
thread menangani pekerjaan atau layanan tertentu secara independen yang jika
digabungkan kembali akan setara dengan hasil eksekusi seluruh proses dengan
lengkap.
Thread pada sistem operasi modern menjadi suatu bagian yang penting. Misalkan
sebuah proses, berfungsi untuk menerima masukan secara real time dan sesuai
dengan masing-masing masukan, proses tersebut harus menghasilkan keluaran
tertentu. Jika prosesnya tidak dibuat menjadi beberapa thread berbeda (multi-thread),
maka instruksi dalam proses akan dieksekusi secara berurutan atau dalam terminologi
sistem operasi sering disebut eksekusi sinkron.
Keterbatasan dalam hal ini adalah proses tidak dapat menerima masukan sampai
pemrosesan masukan sebelumnya telah selesai. Dan jika pemrosesan masukan
1
sebelumnya membutuhkan waktu yang lama, maka masukan selanjutnya akan terus
ditahan. Solusi atas permasalahan ini adalah memecah proses menjadi beberapa
thread yang berbeda, agar proses tersebut dapat dijalankan secara asinkron.
2
Gambar 1. Inkonsistensi Data karena Penggunaan Threads
2. Gunakan aplikasi pengolah teks yang ada pada sistem operasi linux seperti
nano, pico ataupun vi dan vim.
void * thread1()
{
while(1){
printf("Hello!!\n");
3
}
}
void * thread2()
{
while(1){
printf("How are you?\n");
}
}
int main()
{
int status;
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread1,NULL);
pthread_create(&tid2,NULL,thread2,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
7. Kembali tuliskan kode program berikut ini pada sebuah berkas baru.
threaddua.c
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
pthread_t tid[2];
4
void* doSomeThing(void *arg)
{
unsigned long i = 0;
pthread_t id = pthread_self();
if(pthread_equal(id,tid[0]))
{
printf("\n First thread processing\n");
}
else
{
printf("\n Second thread processing\n");
}
for(i=0; i<(0xFFFFFFFF);i++);
return NULL;
}
int main(void)
{
int i = 0;
int err;
while(i < 2)
{
err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
if (err != 0)
printf("\ncan't create thread :[%s]", strerror(err));
else
printf("\n Thread created successfully\n");
i++;
}
sleep(5);
return 0;
}
11. Buka aplikasi terminal yang lain, dan jalankan kedua thread tersebut.
5
12. Temukan identitas proses (dan mungkin juga thread) yang terkait dengan
perintah eksekusi kedua thread tersebut!
13. Apakah yang bisa dijelaskan dari kedua contoh thread diatas? Apa yang menjadi
masalah utama dalam hal ini?
6
Soal Latihan untuk Tugas
1. Berikut ini adalah sebuah kode program yang dijalankan secara sekuensial.
Dibentuk menjadi satu proses dengan single thread.
singlethread.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct acct_t {
int bal;
};
/*
* Pointer to accounts
*/
struct acct_t *accts;
/*
* Method to perform a number of transactions.
* Parameter "dummy" is not used.
*/
void *transact(void *dummy)
{
int i;
for (i = 0; i < num_trans; i++) {
// pick two random accounts
int acct_id_from = rand() % num_accts;
int acct_id_to = rand() % num_accts;
// pick a random amount
int amt = rand() % 100;
7
// make sure the number of arguments is odd (including the
program name)
if (!(argc == 1 || argc == 3 || argc == 5 || argc == 7)) {
fprintf(stderr, "usage: %s [-a <accts>] [-i
<transactions>] [-t <think-time>]\n", argv[0]);
exit(-1);
}
8
// find the total sum of all accounts after the transfers
are done
int sum = 0;
for (i = 0; i < num_accts; i++) {
sum += accts[i].bal;
}
return 0;
}
3. Jalankan program di atas. Tunjukkan tampilan yang ada pada terminal serta
berikan penjelasan singkat dari output program tersebut.
4. Buat tulisan ilmiah yang berisi penjelasan tentang kode program singlethread
yang telah dimodifikasi dengan aturan sebagai berikut:
a. Modifikasi kode tersebut menjadi beberapa thread yang berbeda dan
simpan dengan nama berkas threadtiga.
Referensi
1. http://www.csc.villanova.edu/~mdamian/threads/posixthreads.html
2. https://blog.feabhas.com/2016/08/three-nos-sequential-consistency
9
3. https://www.cis.upenn.edu/~cdmurphy/cis542/spring2012/homework/lab03-
threads.html
4. http://www.thegeekstuff.com/2012/04/create-threads-in-linux
5. https://linuxprograms.wordpress.com
6. http://www.cs.cmu.edu/afs/cs/academic/class/15492-f07/www/pthreads.html
Kesimpulan
1. Jelaskan hubungan antara process dan thread.
2. Jelaskan perbedaan dari Singlethread dan Multithread.
3. Sebutkan dan jelaskan macam-macam Multithreading Model.
10