Answer to hello.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 4
void * hello (void *ThreadNumber)
{ printf ("Hello, world from thread %d\n", *(int *) ThreadNumber);
return 0;
}
int main (int argc, char *argv[])
{
pthread_t h[NTHREADS];
int rc;
int LoopCount;
int my_num[NTHREADS]; /* FIX: Add this line */
for (LoopCount = 0; LoopCount < NTHREADS; LoopCount++)
{
my_num[LoopCount] = LoopCount; /* FIX: Add this line */
/* FIX: change this line...
rc = pthread_create (&h[LoopCount], 0, hello, (void *) &LoopCount);
...to this: */
rc = pthread_create (&h[LoopCount], 0, hello, (void *) &my_num[LoopCount]);
}
for (LoopCount = 0; LoopCount < NTHREADS; LoopCount++)
{ rc = pthread_join (h[LoopCount], 0);
}
}
Answer to dataraces.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 4
int globalX = 0;
pthread_mutex_t cs;
void * increment (void *arg)
{
pthread_mutex_lock (&cs);
globalX++;
pthread_mutex_unlock (&cs);
return 0;
}
int main (int argc, char *argv[])
{
pthread_t h[NTHREADS];
int rc;
int i;
pthread_mutex_init (&cs, 0);
printf ("START\n");
for (i = 0; i < NTHREADS; i++)
{
rc = pthread_create (&h[i], 0, increment, 0);
}
for (i = 0; i < NTHREADS; i++)
{
rc = pthread_join (h[i], 0);
}
pthread_mutex_destroy (&cs);
printf ("TOTAL = %d\n", globalX);
printf ("STOP\n");
}
Answer to deadlock.c
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t cs0 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t cs1 = PTHREAD_MUTEX_INITIALIZER;
int globalX = 0;
int globalY = 0;
void * work0 (void *arg)
{ pthread_mutex_lock (&cs1);
globalX++;
pthread_mutex_unlock (&cs1);
pthread_mutex_lock (&cs0);
globalY++;
pthread_mutex_unlock (&cs0);
return 0;
}
void * work1 (void *arg)
{ pthread_mutex_lock (&cs1);
globalX++;
pthread_mutex_unlock (&cs1);
pthread_mutex_lock (&cs0);
globalY++;
pthread_mutex_unlock (&cs0);
return 0;
}
int main (int argc, char *argv[])
{ pthread_t h[2];
int rc;
pthread_mutex_init (&cs0, 0);
pthread_mutex_init (&cs1, 0);
printf ("START\n");
rc = pthread_create (&h[0], 0, work0, 0);
rc = pthread_create (&h[1], 0, work1, 0);
rc = pthread_join (h[0], 0);
rc = pthread_join (h[1], 0);
/* needed to be put after join */
printf ("TOTAL = (%d,%d)\n", globalX, globalY);
printf ("STOP\n");
pthread_mutex_destroy (&cs0);
pthread_mutex_destroy (&cs1);
}
--
MattWalsh - 31 Oct 2006