Thursday, February 12, 2009

POSIX Thread: Mutual Exclusion Locks (mutex)

Race Condition adalah kondisi dimana program mengakses memory dan melakukan perubahan secara bersamaan, sehingga tidak ada konsistensi data, karena satu proses bisa terdiri dari beberapa eksekusi thread. Bagaimana jika kode di bawah ini kita jalankan dengan menghilangkan pthread_mutex_lock (&mutex) dan pthread_mutex_unlock (&mutex)?, kita kemungkinan besar akan mendapatkan urutan nomor thread yang berurutan tapi tidak selamanya. Beban atau load thread ini sangat sederhana, tidak ada beban sistem yang berarti untuk delay. Jika beban masing-masing thread lebih variatif, kita tidak akan lagi mendapatkan nomor urut thread yang berurutan. POSIX Thread menyediakan Mutual Exclusion (mutex) untuk menghadapi Race Condition. Dengan mutex, thread akan di "antri" untuk dijalankan setelah thread lainnya selesai atau lock dihilangkan, thread yang masuk dalam antrian berada dalam kondisi block atau diam menunggu thread sebelumnya selesai lalu dijalankan secara berurutan.

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

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int id = 0;

static void* my_thread (void *data)
{
pthread_mutex_lock (&mutex);
usleep (500000);
printf ("i'm thread: %i\n", ++id);
pthread_mutex_unlock (&mutex);
return NULL;
}

int main (void)
{
pthread_t thread[5];
int i = 5;

while (i--)
{
pthread_create (&thread[i], NULL, my_thread, NULL);
}
pause ();

return 0;
}