Mutual exclusion (Mutex) adalah sebuah objek program yang dibuat sehingga beberapa program thread dapat berbagi sumber daya yang sama, seperti akses ke file. Mutual exclusion merupakan suatu kondisi dimana setiap sumber daya diberikan tepat pada satu proses pada suatu waktu.
Berdasarkan contoh program saat program dimulai, ia menciptakan mutex untuk diberikan sumber daya pada awal dengan meminta dari sistem dan sistem kembali nama unik atau ID. Setelah itu, setiap thread yang membutuhkan sumber daya yang harus menggunakan mutex untuk mengunci sumber dari thread lain sementara menggunakan sumber daya. Jika mutex sudah terkunci, sebuah thread yang membutuhkan sumber daya yang biasanya antri oleh sistem dan kemudian diberikan kontrol ketika mutex menjadi unlocked.
Pada output aplikasi Mutual Exclusion terdapat 5 thread dan proses penulisan file pada masing-masing thread dengan mengakses sumber daya file yang di shared.
Dapat dilihat pada outputnya 5 thread berproses bersamaan namun thread 0 ketika menulis file tidak berpengaruh pada thread 2,1,3,4 (output).
Listing versi POSIX Thread dan dikompilasi dengan gcc :
mutex_example.cpp
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#define NUM_THREADS 5
FILE *shared_fd; pthread_mutex_t hFileMutex
bool Use_Mutex;
int ThreadFunction(int);
int main(int argc, char *argv[])
{
int i;
pthread_t hThread[NUM_THREADS];
if(argc > 1) Use_Mutex = false;
else Use_Mutex = true;
if (Use_Mutex) {
if (pthread_mutex_init(&hFileMutex, NULL)) {
fprintf(stderr, "pthread_mutex_init failed\n");
return -1;
}
}
shared_fd = stdout;
srand((unsigned)time(NULL));
for (i=0; i < NUM_THREADS; ++i) {
if (pthread_create(&hThread[i], 0, (void*(*)(void*)) ThreadFunction, (void *) i) < 0) {
fprintf(stderr, "pthread_create failed: %s\n", strerror(errno));
return -1;
}
}
for (i=0; i < NUM_THREADS; ++i) {
pthread_join(hThread[i], NULL);
}
fclose(shared_fd);
return 1;
}
int ThreadFunction(int num)
{
if (Use_Mutex)
pthread_mutex_lock(&hFileMutex);
fprintf(shared_fd, "I am thread %d.\n", num);
fflush(shared_fd);
usleep( 1000 );
fprintf(shared_fd, "Thread %d is the very best.\n", num);
fflush(shared_fd);
usleep( 1000 );
fprintf(shared_fd, "Thread %d is in control.\n", num);
fflush(shared_fd);
if (Use_Mutex)
pthread_mutex_unlock(&hFileMutex);
return 0;
}
-6.574056
106.749034