Apakah anda tau apa itu bilangan Prima? dan Bagaimana suatu bilangan dikatakan bilangan prima? Bilangan prima adalah suatu bilangan hanya dapat dibagi dengan satu dan dibagi dengan dirinya sendiri. Sebagi contoh bilangan 3, 3 hanya dapat dibagi dengan satu dan tiga yang memiliki sisa bagi yaitu nol. Jika Anda mencoba untuk membagi dua maka Anda akan mendapatkan sisa satu. Oleh karena itu 3 adalah bilangan prima. Mari kita contoh lain nomor 4, 4 bukan bilangan prima karena ketika Anda membaginya dengan 2 Anda mendapatkan sisa nol. Definisi dari kami menyatakan bahwa bilangan yang hanya dapat memiliki sisa nol ketika dibagi dengan satu dan dirinya sendiri, nomor 4 jelas melanggar aturan ini ketika dibagi dengan 2, 5 di sisi lain tidak dapat dibagi dengan apa-apa tapi satu dan dirinya sendiri sehingga prima. Sudah jelaskan? :-)
Jadi sekarang kita memahami apa itu bilangan prima yang memungkinkan mencoba dan membuat algoritma kode sederhana yang menggambarkan perilaku ini. Katakanlah seseorang datang kepada Anda di jalan dan meminta Anda untuk mendaftar setiap bilangan prima yang datang sebelum apa yang pernah bilangan (kita akan menyebutnya "batas atas") mereka meminta Anda.
For setiap bilangan X yang datang sebelum batas atas kami
For setiap bilangan Y yang datang sebelum X
IF X MOD Y tidak nol tidak sama
THEN bilangan ini harus prima
ELSE X harus dapat dibagi oleh beberapa Y sehingga BUKAN bilangan prima
Mod atau Modulus (%) merupakan sisa pembagian.
Contoh 1:
3 % (MOD) 1 = 0;
Karena ketika Anda membagi 3 dengan 1, 1 masuk ke 3, 3 kali. Ini memberi kita sisa nol.
Contoh 2:
5 % 3 = 2; Karena 3 masuk ke 5 kali, jadi 2 yang tersisa sebagai sisanya.
Divisi Modulus benar-benar akan membantu kami dengan masalah ini yaitu bilangan prima.
POSIX Threads
Sekarang saatnya untuk berbicara tentang POSIX Threads. POSIX Threads bekerja hampir seperti java thread dalam arti bahwa java memiliki method run yang dipanggil setelah Anda menggunakan fungsi start. Nah, POSIX thread membuat metode yang menerima fungsi sebagai salah satu parameternya, fungsi ini tidak disebut secara langsung melainkan proses pembuatannya memanggil untuk Anda.
Bagaimana Anda membuat sebuah thread?Mari kita lihat contoh kode di bawah ini:
CODE:
#include
#include
#include
void *runner(void *param); /* the thread */
int main(int argc, char *argv[]) {
//Verify two args were passed in
if(argc < 2) {
fprintf(stderr, "USAGE: ./prime.out
exit(1);
}
//verify the input is greater then or equal to two
if(atoi(argv[1]) < 2) {
fprintf(stderr, "USAGE: %d must be >= 2\n", atoi(argv[1]));
exit(1);
}
pthread_t tid; //Thread ID
pthread_attr_t attr; //Set of thread attributes
printf("Prime Numbers: ");
//Get the default attributes
pthread_attr_init(&attr);
//Create the thread
pthread_create(&tid,&attr,runner,argv[1]);
//Wait for the thread to exit
pthread_join(tid,NULL);
printf("\nComplete\n");
}
//The thread will begin control in this function
void *runner(void *param) {
int i,j,upper = atoi(param);
/* Check to see if a number is prime */
for(i = 2; i < upper; i++) {
int trap = 0;
/* Check each number for divisibility */
for(j = 2; j < i; j++) {
int result = i % j;
/* If any of the numbers divide cleanly
then this number is not prime. So
stop checking. */
if(result == 0) {
trap = 1;
break;
}
}
//No numbers divided cleanly so this number must be prime
if(trap == 0) {
printf("[%d] ", i);
}
}
//Exit the thread
pthread_exit(0);
}
OUTPUT:
Prime Numbers: [2] [3] [5] [7] [11] [13] [17] [19] [23] [29] [31] [37] [41] [43] [47] [53] [59] [61] [67] [71] [73] [79] [83] [89] [97]
Seperti yang Anda lihat kita membuat penggunaan POSIX pthread API. Kita mengatur atribut default pada threads kemudian menciptakannya. Ketika kita menciptakannya kita mem-passing kedalam Thread ID, atribut, fungsi yang kita gunakan disebut sebagai thread, dan akhirnya parameter. Dalam hal ini kita mem-di-passing pada masukan user karena itu tugas pointer jadi itu mudah.
Dalam algoritma bilangan prima kita tidak memeriksa 1 atau bilangan sendiri untuk melihat apakah itu memilki sisa bagi nol, terutama karena kita sudah tahu begitu akan benar-benar tidak ada gunanya memeriksa, itu juga akan membuat algorithim kita lebih kompleks tanpa alasan dan itu tidak pernah menjadi hal yang baik.
Selamat coding, harap ini membantu dalam beberapa cara. :)
[Catatan]: Untuk Linux, kompilasi pthreads menggunakan gcc memerlukan opsi baris perintah.
EX. : gcc-o -lpthread prime.out prime.c
source: [macboypro]