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

Topic revision: r1 - 31 Oct 2006 - MattWalsh
 
This site is powered by the TWiki collaboration platformCopyright © 2008-2012 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback