title | author | institute | date | theme | header-includes | |
---|---|---|---|---|---|---|
Thread |
Praktikum Sistem Operasi |
Ilmu Komputer IPB |
2023 |
Dresden |
|
- thread adalah satuan dasar utilisasi CPU1
- tiap thread memiliki:
- id, program counter, register set, dan stack
- dalam satu proses, thread berbagi:
- segmen teks, data, dan heap, serta sumberdaya lain (mis. file)
- proses multithreaded memiliki beberapa thread yang dapat mengerjakan beberapa tugas secara bersamaan
- Linux memakai thread standar POSIX2 (
pthread
) - saat kompilasi tambahkan flag
-pthread
pthread_create(thread, attr, func, arg);
{.c}
- membuat satu
thread
dengan atributattr
yang akan menjalankan fungsifunc
dengan argumenarg
3 - deklarasi fungsi tersebut:
void *func(void *arg);
{.c}4
pthread_join(thread, retval);
{.c}
- menunggu
thread
selesai dan menyimpan keluarannya ke variabelretval
5
pthread_exit(retval);
{.c}
- mengakhiri thread dengan nilai keluaran
retval
6
#include <stdio.h>
#include <pthread.h>
void *hello(void *arg) {
puts("hello");
pthread_exit(NULL);
}
int main() {
pthread_t t;
pthread_create(&t, NULL, hello, NULL);
pthread_join(t, NULL);
return 0;
}
...
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, hello, NULL);
pthread_create(&t2, NULL, hello, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
...
#define N 8
int main() {
pthread_t t[N];
for (int i = 0; i < N; i++)
pthread_create(&t[i], NULL, hello, NULL);
for (int i = 0; i < N; i++)
pthread_join(t[i], NULL);
return 0;
}
#include <stdio.h>
#include <pthread.h>
void* hello(void* arg) {
printf("hello from thread %d\n", ((int*)arg)[0]);
pthread_exit(NULL);
}
int main() {
pthread_t t;
int id[] = {1};
pthread_create(&t, NULL, hello, &id[0]);
pthread_join(t, NULL);
return 0;
}
...
int main() {
pthread_t t1, t2;
int id[] = {1, 2};
pthread_create(&t1, NULL, hello, &id[0]);
pthread_create(&t2, NULL, hello, &id[1]);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
...
#define N 8
int main() {
pthread_t t[N];
int id[N] = {1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < N; i++)
pthread_create(&t[i], NULL, hello, &id[i]);
for (int i = 0; i < N; i++)
pthread_join(t[i], NULL);
return 0;
}
-
lengkapi program berikut untuk menjumlahkan array
A
-
gunakan variabel global
sum
untuk menyimpan hasilnya#include <stdio.h> #define N 16 int sum = 0; int main() { int A[N] = {68,34,64,95,35,78,65,93, 51,67, 7,77, 4,73,52,91}; /* TODO: array sum */ printf("%d\n", sum); /* 954 */ return 0; }
- sekarang, buat satu buah thread untuk menjumlahkan nilai semua elemen array
A
dengan fungsiarray_sum()
- thread utama hanya membuat dan menunggu thread ini selesai
- oke?
- sekarang gunakan 2 buah thread untuk menjumlahkan nilai semua elemen array A
- pastikan pembagian kerja antara kedua thread seimbang, yaitu tiap thread memproses
$\frac{N}{2}$ elemen
- bisa?
- sekarang gunakan 4 buah thread untuk menjumlahkan nilai semua elemen array A
- pastikan pembagian kerja antara keempat thread seimbang, yaitu tiap thread memproses
$\frac{N}{4}$ elemen - kumpulkan di LMS paling lambat hingga praktikum berakhir
+60
: keluaran benar:954
+20
: jumlah syscallclone
7 ada 4+20
: variabel array A lokal di fungsi utama-20
: pemanggilan fungsipthread
tanpa looping