Kali ini saya akan memposting tentang thread dan contoh penggunaannya. tapi sebelum itu saya akan menjelaskan apa itu thread.
Thread merupakan sebuah alur kontrol proses yang dapat dijadwalkan pengeksekusiannya oleh sistem operasi. Jika kita memiliki banyak proses atau kode program dan ingin menjalankannya secara serentak, maka kita bisa menggunakan thread, ini disebut dengan multithread.
syntax - syntax dalam thread :
pthread_t : merupakan tipe data thread.
pthread_mutex_t : merupakan tipe data mutex thread. mutex merupakan routine yang berhubungan dengan sinkronisasi. fungsi mutex menyediakan perintah untuk membuat, menghancurkan, mengunci dan membuka kunci mutex. kemudian ditambah juga dengan fungsi untuk mengeset attribut yang terkait dengan mutex.
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
Fungsi yang digunakan untuk menciptakan thread baru dalam suatu proses dengan atribut ditentukan oleh attr. Jika attr diisi NULL, atribut default akan dimuat. Jika pemanggilan fungsi berhasil, fungsi akan menyimpan ID dari thread ciptaan pada rujukan yang ditunjuk thread.
void *(*start_routine)(void*) adalah nama fungsi thread yg dipanggil, jadi fungsi thread selalu bertipe void*.
void *arg merupakan argumen atau parameter yang dikirim ke fungsi thread, parameter juga selalu bertipe void* dan hanya boleh ada satu parameter. Jadi parameter yg dikirim harus diubah dahulu ke void*, misal parameter yg dikirim adalah int x, maka penulisannya mejadi (void*)x. Jika ingin mengirim lebih dari satu parameter, maka bisa menggunakan struct.
pthread_detach(pthread_t thread);
Fungsi ini digunakan untuk mengindikasikan pada implementasi bahwa ruang penyimpanan thread pada thread bisa diminta kembali ketika thread berakhir
pthread_cancel(pthread_t thread);
Fungsi ini digunakan untuk meminta agar thread dibatalkan. Kondisi kemampuan membatalkan dan tipe dari thread yang dituju menentukan kapan pembatlan terjadi. sebelum memanggil fungsi pthread_cancel, terlebih dahulu harus meng-enable pthread_setcancelstate. penulisannya adalah pthread_setcancelstate(PTHHREAD_CANCEL_ENABLE, NULL);
pthread_mutex_lock(pthread_mutex_t *mutex);
Fungsi ini digunakan untuk mengunci objek mutex yang dirujuk oleh mutex. Jika mutex sudah dikunci, thrad pemanggil akan ditahan hingga mutex menjadi tersedia (tidak terkunci). Operasi ini mengembalikan objek mutex yang dirujuk oleh mutex pada keadaan terkunci dengan thread pemanggil sebagai pemiliknya.
contoh penggunaan pthread_mutex_lock:
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *thread1(void *ptr)
{
pthread_mutex_lock(&lock);
printf("a");
printf("b");
printf("c");
pthread_mutex_unlock(&lock);
}
void *thread2(void *ptr)
{
printf("d");
printf("e");
printf("f");
}
void *thread1(void *ptr)
{
pthread_mutex_lock(&lock);
printf("a");
printf("b");
printf("c");
pthread_mutex_unlock(&lock);
}
void *thread2(void *ptr)
{
printf("d");
printf("e");
printf("f");
}
jika pada fungsi thread1 tidak menggunakan pthread_mutex_lock, maka outputnya bisa saja "adebcf", atau "daebfc", atau yang lain. tetapi jika kita ingin mencetak 'a', 'b', dan 'c' secara berurutan, maka bisa menggunakan pthread_mutex_lock seperi pada program diatas. jadi ketika thread1 memasuki fungsi pthread_mutex_lock, thread2 akan menunggu sampai thread1 mengeksekusi pthread_mutex_unlock. output dari program diatas adalah bisa "dabcef", atau "deabcf", atau "abcdef", atau yang lain dimana 'a', 'b', dan 'c' selalu dicetak berurutan.
pthread_mutex_unlock(pthread_mutex_t *mutex);
Fungsi ini berguna untuk membebaskan objek mutex yang dirujuk mutex. Bagaimana cara mutex dibebaskan tergantung dari tipe atribut mutex
pthread_mutex_destroy(pthread_mutex_t *mutex);
Fungsi ini menghancurkan objek mutex yang dirujuk oleh mutex, sehingga objek tersebut menjadi tidak terinisialisasi. Objek yang dihancurkan bisa diinisialisasi masukan diberikan .
pthread_exit() : digunakan untuk menghentikan thread.
pthread_join(pthread_t thread)
digunakan untuk menunggu sampai thread yang bersangkutan selesai, baru kemudian melanjutkan kode program utama. pthread_join digunakan jika kita ingin menjalankan kode program setelah thread berakhir, atau ketika tidak ada kode program lagi setelah menciptakan thread. karena thread dan kode program utama berjalan bersamaan, maka jika tidak ada kode program yang dijalankan setelah menciptakan thread, maka fungsi main akan berakhir. berakhirnya fungsi main juga mengakibatkan thread berhenti, baik thread sudah selesai maupun belum. jadi agar thread dijalankan sampai selesai sebelum fungsi main berakhir, maka bisa menggunakan pthread_join.
Contoh program yang menggunakan thread:
berikut ini adalah contoh program yang menggunakan thread. program berikut ini adalah program simulai balapan dari 5 peserta sebanyak 2 putaran, lalu pada akhir program akan mencetak siapa juara 1, 2, dan 3. pada program berikut ini menggunakan thread sebanyak 6, yaitu 5 thread untuk peserta, yang berisi pertambahan jarak yang dicapai peserta dan status juara jika sudah mencapai finish. dan satu lagi thread untuk mencetak posisi peserta. pada fungsi print menggunakan metode clear lalu print lagi, dan seterusnya sampai kelimanya mencapai finish, agar terlihat seperti balapan sungguhan.
#include <stdio.h>
#include <pthread.h>
int perenang[5] = {0,0,0,0,0}, finish = 0;
char juara[5], nama[] = "ABCDE";
void *print(void *ptr)
{
int i, j;
system("clear");
for(i = 0; i < 5; i++)
printf("%c\n",nama[i]);
usleep(100000);
while(finish < 5)
{
system("clear");
for(i = 0; i < 5; i++)
{
if(perenang[i]%100 <= 50)
{
for(j = 0; j < perenang[i]%100-1; j++)
printf(" ");
printf("%c",nama[i]);
}
else
{
for(j = 0; j < 100 - perenang[i]%100; j++)
printf(" ");
printf("%c", nama[i]);
}
printf("\n");
}
usleep(100000);
}
system("clear");
for(i = 0; i < 5; i++)
printf("%c\n",nama[i]);
}
void *renang(void *ptr)
{
int jarak, i = (int)ptr;
while(perenang[i] < 200)
{
jarak = rand()%2+1;
perenang[i] += jarak;
if(perenang[i] >= 200)
{
perenang[i] = 201;
juara[finish++] = nama[i];
}
usleep(100000);
}
}
int main()
{
pthread_t lomba[5], p;
srand((unsigned)time(NULL));
int i;
pthread_create(&p, NULL, print, NULL);
for(i = 0; i < 5; i++)
{
pthread_create(&lomba[i], NULL, renang, (void *)i);
}
pthread_join(p, NULL);
for(i = 0; i < 5; i++)
{
pthread_join(lomba[i], NULL);
}
for(i = 0; i < 3; i++)
{
printf("Juara ke %d adalah perenang %c\n",i+1,juara[i]);
}
return 0;
}
#include <pthread.h>
int perenang[5] = {0,0,0,0,0}, finish = 0;
char juara[5], nama[] = "ABCDE";
void *print(void *ptr)
{
int i, j;
system("clear");
for(i = 0; i < 5; i++)
printf("%c\n",nama[i]);
usleep(100000);
while(finish < 5)
{
system("clear");
for(i = 0; i < 5; i++)
{
if(perenang[i]%100 <= 50)
{
for(j = 0; j < perenang[i]%100-1; j++)
printf(" ");
printf("%c",nama[i]);
}
else
{
for(j = 0; j < 100 - perenang[i]%100; j++)
printf(" ");
printf("%c", nama[i]);
}
printf("\n");
}
usleep(100000);
}
system("clear");
for(i = 0; i < 5; i++)
printf("%c\n",nama[i]);
}
void *renang(void *ptr)
{
int jarak, i = (int)ptr;
while(perenang[i] < 200)
{
jarak = rand()%2+1;
perenang[i] += jarak;
if(perenang[i] >= 200)
{
perenang[i] = 201;
juara[finish++] = nama[i];
}
usleep(100000);
}
}
int main()
{
pthread_t lomba[5], p;
srand((unsigned)time(NULL));
int i;
pthread_create(&p, NULL, print, NULL);
for(i = 0; i < 5; i++)
{
pthread_create(&lomba[i], NULL, renang, (void *)i);
}
pthread_join(p, NULL);
for(i = 0; i < 5; i++)
{
pthread_join(lomba[i], NULL);
}
for(i = 0; i < 3; i++)
{
printf("Juara ke %d adalah perenang %c\n",i+1,juara[i]);
}
return 0;
}
Apabila program diatas kita running, maka hasilnya akan seperti berikut:
Keren bukan? contoh diatas adalah contoh mudah dalam penggunaan thread. Masih banyak hal keren yang dapat dibuat menggunakan thread. Jadi selamat mencoba...
Semoga postingan saya bermanfaat...
Tidak ada komentar:
Posting Komentar