Tujuan
• Mahasiswa memahami konsep pembuatan thread pada lingkungan UNIX
• Mahasiswa mampu memanfaatkan API Posix Thread untuk membuat dan mengatur thread
• Meningkatkan kemampuan pemrograman bahasa C
Deskripsi
Thread adalah unit terkecil dari proses yang dapat dieksekusi oleh CPU. Satu proses dapat terdiri dari beberapa
thread. Pada lingkungan UNIX, thread dapat dibuat dan diatur dengan menggunakan API Posix Thread. Pada
tugas kedua ini Anda diminta untuk membuat program perkalian matriks yang ada pada buku Operating Systems
Concepts 8th Edition, halaman 178 atau buku Operating Systems Concepts Essential, halaman 170. Program yang
dibuat adalah dengan menggunakan bahasa C dan API Posix Thread.
Solusi dalam C
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define M 3 #define K 2 #define N 3 void *runner (void *param); int A [M][K] = { {1,4}, {2,5}, {3,6} }; // Array ukuran M*K (3 baris 2 kolom) int B [K][N] = { {8,7,6}, {5,4,3} }; // Array ukuran K*N (2 baris 3 kolom) int C [M][N]; // Array ukuran M*N (3 baris 3 kolom) /* Structure untuk mem-passing data ke thread */ struct v { int i; // Menunjukkan baris int j; // Menunjukkan kolom }; int main() { pthread_t tid [M*N]; // Array of thread bernama tid dengan size M*N = 3*3 = 9 int i; // Menunjukkan baris int j; // Menunjukkan kolom int indeks; // Menunjukkan indeks pada array of thread for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { struct v *data = (struct v*) malloc (sizeof (struct v)); // Membuat objek structure v bernama data // dengan mengalokasikan memori sebesar size dari structure v data -> i = i; // Mengeset nilai i pada objek structure v bernama data dengan nilai i data -> j = j; // Mengeset nilai j pada objek structure v bernama data dengan nilai j pthread_create (&tid[indeks++], NULL, runner, (void *) data); // Membuat thread pada array of thread tid pada indeks ke-indeks // dengan memanggil fungsi runner dengan parameter data } } for (indeks = 0; indeks < M*N; indeks++) { pthread_join (tid[indeks], NULL); // Menggabungkan thread-thread yang ada } /* Mencetak hasil perkalian 2 Matriks */ printf ("Hasil:\n"); for (i = 0; i < M; i++) { for (j = 0; j < N; j++) { printf ("%d", C[i][j]); // Output matriks C baris i kolom j } printf ("\n"); } } /* Fungsi untuk melakukan perkalian 2 matriks */ void *runner (void *param) { struct v *par = (struct v*) param; // Mengeset objek structure v bernama par dengan param int h; // Variabel looping int i = par -> i; // Mengeset nilai i dengan nilai i pada par int j = par -> j; // Mengeset nilai j dengan nilai j pada par int hasil = 0; // Menunjukkan hasil perhitungan matriks for (h = 0; h < K; h++) { hasil += A[i][h] * B[h][j]; // Hasil didefiniskan dengan menambahkan semua hasil perkalian baris i kolom h dengan baris h kolom j C[i][j] = hasil; // Mengeset nilai matriks C pada baris i dan kolom j dengan hasil } }
Leave a Reply