Thread terbagi menjadi 2 macam yaitu:
- Single thread
- Multi thread
Contoh kasus single dan multi thread :
Misalnya, user ingin menjalankan 2 perintah sekaligus yaitu menginputkan suatu string sambil menjalankan sebuah file lagu.
Jika menggunakan single thread, alur proses yang akan terjadi adalah proses akan menunggu hingga user selesai menginputkan string, setelah itu perintah selanjutnya dieksekusi yaitu menjalankan sebuah file lagu.
Jika menggunakan multi thread keiinginan user dapat tercapai, proses akan langsung menjalankan 2 perintah tersebut sekaligus sehingga meskipun user belum selesai menginputkan string, file lagu sudah dijalankan/di-play.
Thread Identification
Seperti halnya sebuah proses diidentifikasi melalui sebuah proses ID, sebuah thread juga diidentifikasi melalui sebuah thread ID. Thread ID direpresentasikan menggunakan tipe data 'pthread_t'
Thread Creation
Ketika suatu program dijalankan dan menjadi proses, proses tersebut berjalan dengan default thread. Jadi bisa dibilang setiap proses pasti memiliki minimal single thread. Sebuah proses dapat membuat thread tambahan(multi thread) dengan menggunakan fungsi :
Fungsi di atas menggunakan 4 argumen :
Thread Identification
Seperti halnya sebuah proses diidentifikasi melalui sebuah proses ID, sebuah thread juga diidentifikasi melalui sebuah thread ID. Thread ID direpresentasikan menggunakan tipe data 'pthread_t'
Thread Creation
Ketika suatu program dijalankan dan menjadi proses, proses tersebut berjalan dengan default thread. Jadi bisa dibilang setiap proses pasti memiliki minimal single thread. Sebuah proses dapat membuat thread tambahan(multi thread) dengan menggunakan fungsi :
Fungsi di atas menggunakan 4 argumen :
- Argumen pertama merupakan alamat dari variabel yang bertipe data pthread_t, ketika fungsi berhasil dijalankan, variabel tersebut akan berisi ID thread dari thread yang baru dibuat.
- Argumen kedua dapat berisi atribut yang kita ingin tambahkan ke thread, atribut tersebut bisa berupa prioritas, dll.
- Argumen ketiga merupakan alamat fungsi yang akan dijalankan thread baru tersebut.
- Argumen keempat merupakan argumen yang akan di pass ke fungsi yang akan dijalankan thread sebagai parameter fungsi tersebut.
Contoh Multi thread sederhana:
Outputnya :
Jadi, proses di atas membuat 2 thread menggunakan fungsi pthread_create, di mana kedua thread tersebut akan dijalankan secara bersamaan pada fungsi yang ditujunya, sehingga kedua fungsi tersebut dapat berjalan bersamaan. Hasil output code di atas mungkin akan berbeda-beda(misal pesan dari thread 1 ditampilkan terlebih dahulu), karena urutan dari eksekusi thread tidak selalu sama, tergantung dari algoritma scheduling OS.
2. Join Thread
Perhatikan program berikut :
Outputnya :
Jadi, proses di atas membuat 2 thread, yang seharusnya akan menjalankan fungsi tulis, namun pada outputnya hanya tercetak tulisan bahwa thread tersebut berhasil dibuat, mengapa demikian? Hal tersebut terjadi karena sebelum kedua thread di-scheduled atau dijadwalkan, parent thread (yang menciptakan kedua thread tersebut) telah selesai dieksekusi. Maksud dari parent thread adalah default thread yang terdapat dalam fungsi main. Sehingga ketika default thread pada fungsi main tersebut selesai dieksekusi, proses diterminasi ketika nilai main() di return.
Cara untuk mengatasi persoalan di atas adalah menggunakan fungsi :
Fungsi di atas berfungsi menunda eksekusi calling thread (misal parent thread) hingga target thread (argumen pertama pada fungsi pthread_join) selesai dieksekusi. Argumen kedua pada fungsi pthread_join merupakan return value dari target thread. Dengan menggunakan fungsi ini, parent thread pada fungsi main akan di-suspend/menunggu hingga target thread / child thread yang diinginkan selesai dieksekusi.
Perhatikan program berikut :
Outputnya :
Perhatikan penggunaan fungsi pthread_join pada program di atas, parent thread pada fungsi main akan menunggu hingga thread kesatu dan kedua selesai dieksekusi barulah proses diterminasi.
3. Mutex
Mutex(Mutual Exclusion Device) berfungsi untuk sinkronisasi thread yang diibaratkan sebagai kunci yang dipakai oleh thread untuk mengunci shared resources agar tidak digunakan oleh thread yang bukan penguncinya, setelah proses di dalamnya selesai maka thread tersebut akan membuka kuncinya agar kunci tersebut dapat digunakan oleh thread lain secara bergiliran.
Tujuan dari penguncian shared resources tersebut agar menjaga shared resources tidak dimodifikasi oleh thread lain apabila suatu thread belum selesai menggunakannya.
Perhatikan program berikut :
Outputnya :
Perhatikan outputnya, output yang diharapkan adalah program tersebut akan mencetak "Thread 1 selesai" dan "Thread 2 selesai", namun faktanya yang tercetak adalah 2 line "Thread 2 selesai". Hal tersebut terjadi karena ketika thread ke-1 masih processing, scheduler menjadwalkan/menjalankan thread ke-2, sehingga nilai i di-increment sebelum proses thread ke-1 selesai, menyebabkan nilai i yang dicetak pada thread ke-1 salah(nilainya 2 harusnya 1). Untuk mengatasi masalah tersebut digunakanlah mutex.
Fungsi untuk inisialisasi objek mutex(pada contoh dinamakan lock) :
Fungsi untuk mengunci & membuka kunci source code/shared source menggunakan mutex :
Perhatikan program berikut :
Outputnya :
Dengan menerapkan mutex pada program di atas, thread ke-2 yang akan meng-akses daerah source code yang di lock oleh thread ke-1 akan menunggu hingga thread ke-1 membuka lock tersebut, sehingga nilai i dapat dijaga pada setiap proses thread.
Sekian postingan dari saya, terima kasih :)
sip gan
BalasHapusSolder uap