Title: COMP309/509 - Lecture 10 class: middle, center, inverse

COMP309/509 - Parallel and Distributed Computing

Lecture 10 - Multithreaded Programming with Mutual Exclusion

By Mitchell Welch

University of New England


Reading


Summary


Thread Synchronisation


Thread Synchronisation

.center[image]


Thread Synchronisation

.center[image]


Thread Synchronisation


Thread Synchronisation

.center[image]


Thread Synchronisation


Mutexes - Mutual Exclusion Devices


Mutexes - Mutual Exclusion Devices


Mutexes - Mutual Exclusion Devices


Mutexes - Mutual Exclusion Devices


Mutexes - Mutual Exclusion Devices

#include <pthread.h>
  int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t attr);

Mutexes - Mutual Exclusion Devices

  pthread_mutex_init(&lock, NULL);
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Mutexes - Mutual Exclusion Devices

pthread_mutex_t lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

Mutexes - Mutual Exclusion Devices

pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;

Mutexes - Mutual Exclusion Devices

pthread_mutex_t mutex;
...
pthread_mutexattr_t type;
pthread_mutexattr_init(&type);
pthread_mutexattr_settype(&type, PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mutex, &type);

Mutexes - Mutual Exclusion Devices


#include <pthread.h>
  int pthread_mutex_lock(pthread_mutex_t *mutex);

Mutexes - Mutual Exclusion Devices


Mutexes - Mutual Exclusion Devices

#include <pthread.h>
int pthread_mutex_unlock(phread_mutex_t *mutex);

Mutexes - Mutual Exclusion Devices

#include <pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);

Mutex Motivation Examples


#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define THREADS 5
static int sum = 1;
void *updater(void *ptr){
    sum = sum + 1; 
    pthread_exit(NULL);
}
int main(void){
  int i;
  pthread_t threads[THREADS];
  for(i = 0; i < THREADS ; i++)
    pthread_create(&threads[i],NULL,updater,NULL);
  for(i = 0; i < THREADS ; i++)
    pthread_join(threads[i],NULL);
  fprintf(stderr, "sum = %d\n", sum);
  exit(EXIT_SUCCESS);
}

Mutex Motivation Examples


Mutex Motivation Examples

void spin(){
  int j;
  for(j=0; j< delay; j++);
}
void *updater(void *ptr){
  int i;
  spin();  i = sum;
  spin();  i++;
  spin();  sum = i;
  spin();  pthread_exit(NULL);
}

Mutex Motivation Examples

Examples> example02a 100 100
sum = 101
Examples> example02a 100 10000
sum = 55
Examples> example02a 100 1000000
sum = 34
Examples> example02a 100 10000000
sum = 20
Examples> example02a 100 100000000
sum = 3
Examples>

Mutex Motivation Examples

pthread_mutex_t sum_lock;
void *updater(void *ptr){
  pthread_mutex_lock(&sum_lock);
  sum = sum + 1;
  pthread_mutex_unlock(&sum_lock); 
  pthread_exit(NULL);
}

Mutex Motivation Examples

static pthread_mutex_t sum_lock = PTHREAD_MUTEX_INITIALIZER;

Mutex Motivation Examples


void spin(){
  int j;
  for(j=0; j< delay; j++);
}
void *updater(void *ptr){
  int i;
  spin();  pthread_mutex_lock(&sum_lock);
  spin();  i = sum;
  spin();  i++;
  spin();  sum = i; 
  spin();  pthread_mutex_unlock(&sum_lock); 
  spin();  pthread_exit(NULL);
}

Synchronization: Producers and Consumers


Synchronization: Producers and Consumers


Synchronization: Producers and Consumers

#include <pthread.h>
#include <unistd.h>
#define BUFSIZE 8
static int buffer[BUFSIZE];
static int bufin = 0;
static int bufout = 0;
static pthread_mutex_t
   buffer_lock = PTHREAD_MUTEX_INITIALIZER;
int get_buffersize(){
  return BUFSIZE;
}

void get_item(int *itemp){
   pthread_mutex_lock(&buffer_lock);
   *itemp = buffer[bufout];
   bufout = (bufout + 1) % BUFSIZE;
   pthread_mutex_unlock(&buffer_lock);
   return;
}
void put_item(int item){
   pthread_mutex_lock(&buffer_lock);
   buffer[bufin] = item;
   bufin = (bufin + 1) % BUFSIZE;
   pthread_mutex_unlock(&buffer_lock);
   return;
}

Synchronization: Producers and Consumers

.center[buffer]


Synchronization: Producers and Consumers


Synchronization: Producers and Consumers


void *producer(void * arg1){
   int i;
   for (i = 1; i <= SUMSIZE; i++)
      put_item(i*i);
   pthread_exit(NULL);
}
void *consumer(void *arg2){
   int  i, myitem;
   for (i = 1; i <= SUMSIZE; i++) {
      get_item(&myitem);
      sum += myitem; }
   pthread_exit(NULL);
}

Synchronization: Producers and Consumers


Summary


Reading