Threads by Example(2): Threads return value

Melanjutkan bahasan tentang threads, sekarang bagaimana untuk mendapatkan return value dari fungsi thread?
Untuk mendapatkan thread return value, masukkan lokasi value_ptr ke fungsi pthread_join(pthread_t thread, void **value_ptr).

Objective

Yang dipelajari:

  1. mengakses return value dari fungsi thread
  2. menggunakan pthread_exit untuk return
  3. sharing variable global antar thread
  4. membuat detached thread (clean up resource automatically when exit), selain joinable thread (default, harus memanggil pthread_join untuk merelease resource)
  5. mengecek thread_id, sebelum join

Kode program

Berikut program untuk mencari bilangan prima ke-n menggunakan algoritma successive division. Ada 2 thread yang digunakan: 1) untuk menghitung bilangan prima dan 2) untuk menampilkan status pencarian.

/* Belajar #2
Berikut program untuk mencari bilangan prima ke-n menggunakan algoritma successive division. 
 */
#include <pthread.h>
#include <stdio.h>
#include <unistd.h> /*usleep*/

/*parameters*/
int found;
int tmp_candidate;

/*thread function #1
cari bilangan prima
*/
void* compute_prime(void* args)
{
	int n = *((int *) args); /*cast params*/
	int candidate = 2; /*menyimpan bilangan prima*/
	
	/*inisialisasi*/	
	found = 0;
	
	while (1) {
		int factor;
		int is_prime = 1;
		tmp_candidate = candidate;
		/*test dengan successive division*/	
		for (factor = 2; factor < candidate; ++factor)
			if (candidate % factor == 0) {
				is_prime = 0;
				break;	
			}
		/*apakah ini bilangan prima ke-n*/	
		if (is_prime) {
			if (--n == 0) {
			   found = 1;
			   /*return bilangan prima*/
			   return (void *) candidate;
			}
		}
		candidate++;
	}	
	return NULL;
}

/*thread function #2
Print progress (tanpa argument)
*/
void* show_progress(void* args)
{	
	while (!found) {
		printf("Waiting, now candidate is %d\n", tmp_candidate);	
		usleep(1000000); /*sleep for 1s*/
	}
	return NULL;
}


/*Main program
 */
int main()
{
	pthread_t thread1_id;
	pthread_t thread2_id;
	
	int thread1_args = 10000; /*N=10000*/
	int prime;
	
	/*Buat thread untuk kalkulasi bilangan prima, ke N*/
	pthread_create(&thread1_id, NULL, &compute_prime, &thread1_args);
	
	/*Buat thread untuk print status*/
	pthread_create(&thread2_id, NULL, &show_progress, NULL);
	
	/*Tunggu sampai semua thread menyelesaikan tugasnya*/
	/*Thread return value tidak diperlukan, sehingga pointer diset NULL*/
	pthread_join(thread1_id, (void *) &prime); /*thread 1*/
	pthread_join(thread2_id, NULL); /*thread 2*/
	
	printf("Bilangan prima ke-%d adalah %d\n",thread1_args, prime);
	
	return 0;
}

Keluaran yang dihasilkan adalah (bisa beda-beda loh, tapi hasilnya akhirnya tetap sama):

./compute_prime 
Waiting, now candidate is 2789
Waiting, now candidate is 56003
Waiting, now candidate is 75253
Waiting, now candidate is 89051
Waiting, now candidate is 101513
Bilangan prima ke-10000 adalah 104729

Selamat mencoba.

Lihat juga bahasan sebelumnya: Threads by Example (1): Creating threads.

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: