Thread by Example (5): Thread-Specific Data

Semua thread dalam satu program memakai alokasi alamat memory yang sama, yang artinya jika satu thread mengubah isi suatu alamat memory, maka perubahannya akan dapat dilihat oleh thread lain. Hal ini memungkinkan multiple thread untuk beroperasi dengan data yang sama tanpa menggunakan mekanisme interprocess communication.

Namun, kadang kita butuh tiap thread mempunyai alamat data sendiri yang saling independen. Linux menyediakan area thread-specific data, yang memungkinkan tiap thread mempunyai duplikat data yang terpisah, yang dapat diubah tanpa mempengaruhi thread lain.

Objective

Yang dipelajari:

  • menggunakan thread-specific data dalam thread

Fungsi yang digunakan

Fungsi yang digunakan untuk mendeklarasikan, mengeset dan mendapatkan nilai dari tipe data ini adalah:

  • int pthread_key_create(pthread_key_t *key, void *cleanup_func) .
    Nilai key akan digunakan oleh tiap thread untuk mengakses duplikat datanya. Jika cleanup_func diset (tidak NULL), Linux secara otomatis akan memanggil fungsi ini saat thread keluar, passing nilai thread-specific ke key.
  • int pthread_setspecific(pthread_key_t *key, void *address)
    Set thread-specific data dari suatu thread ke address.
  • void* pthread_getspecific(pthread_key_t *key)

Kode program

Dalam program ini, akan dibuat 5 buah thread yang akan menulis message tiap file lognya (dengan nama file yang unik).

/* Belajar #5: thread_specific.c
* 
* Membuat log file untuk tiap thread
* 
* Compile dengan:
*    gcc -o thread_specific thread_specific.c -lpthread
*
* Objective:
* 1) mengimplementasikan data thread-specific dalam thread
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

/*key untuk mengasosiasikan file log ke tiap thread*/
static pthread_key_t thread_log_key;

/*function prototype*/
void *thread_function(void *arg);
void write_to_thread_log(const char* msg);
void close_thread_log(void* thread_log);

int main() {
   int i;
   pthread_t threads[5];

  /*buat sebuah key untuk asosiasi pointer log file ke thread-specific data
  close_thread_log untuk menghapus pointer*/
 pthread_key_create(&thread_log_key, close_thread_log);

 /*buat 5 buah thread */
 for (i=0; i<5; i++ )		
   pthread_create(&threads[i], NULL, thread_function, NULL);	

 /*Tunggu semua thread selesai*/
 for (i=0; i<5; i++)
  pthread_join(threads[i], NULL);		

  printf("Finished.\n");
  exit(EXIT_SUCCESS);
}

/*Tulis msg ke file log untuk tiap thread
 */
void write_to_thread_log(const char* msg)
{
  FILE* thread_log = (FILE *) pthread_getspecific(thread_log_key);
  fprintf(thread_log, "%s\n", msg);	
}

/* Close file log pointer
 */
void close_thread_log(void* thread_log)
{
  fclose((FILE *) thread_log);
}


void *thread_function(void *arg) 
{	
  FILE *thread_log;
  char thread_log_filename[40];
  char msg[40];

  /*Set nama file*/	
  sprintf(thread_log_filename, "thread%d.log", (int) pthread_self());

  /*Buka file tersebut*/
  thread_log = fopen(thread_log_filename, "w");

  /*Simpan pointer file*/
  pthread_setspecific(thread_log_key, thread_log);

  write_to_thread_log("Start thread.");
  sprintf(msg,"It's the message in %s",thread_log_filename);
  write_to_thread_log(msg);
  pthread_exit(NULL);
}

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: