C Programming For Greeting Using Pthread

Ram Pothuraju
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>


#define MAX_THREAD 1000

typedef struct
{
 int id;
 int nproc;
}parm;

char message[100]; /* storage for message  */
pthread_mutex_t msg_mutex = PTHREAD_MUTEX_INITIALIZER;
int token = 0;

void* greeting(void *arg)
{
 parm *p = (parm *) arg;
 int id = p->id;
 int i;

 if (id != 0)
 {
  /* Create message */
  while (1)
  {
   pthread_mutex_lock(&msg_mutex);
   if (token  == 0)
   {
    sprintf(message, "Greetings from process %d!", id);
    token++;
    pthread_mutex_unlock(&msg_mutex);
    break;
   }
   pthread_mutex_unlock(&msg_mutex);
   sleep(1);
  }
  /* Use strlen+1 so that '\0' gets transmitted */
 }
 else
 {    /* my_rank == 0 */
  for (i = 1; i < p->nproc; i++)
  {
   while (1)
   {
    pthread_mutex_lock(&msg_mutex);
    if (token == 1)
    {
     printf("%s\n", message);
     token--;
     pthread_mutex_unlock(&msg_mutex);
     break;
    }
    pthread_mutex_unlock(&msg_mutex);
    sleep(1);
   }
  }
 }

 return NULL;
}

int main(int argc, char *argv[])
{
 int my_rank; /* rank of process      */
 int dest;  /* rank of receiver     */
 int tag = 0; /* tag for messages     */

 pthread_t      *threads;
 pthread_attr_t  pthread_custom_attr;
 parm           *p;

 int n, i;

 if (argc != 2)
 {
  printf("Usage: %s n\n  where n is no. of thread\n", argv[0]);
  exit(1);
 }
 n = atoi(argv[1]);

 if ((n < 1) || (n > MAX_THREAD))
 {
  printf("The no of thread should between 1 and %d.\n", MAX_THREAD);
  exit(1);
 }
 threads = (pthread_t *) malloc(n * sizeof(*threads));
 pthread_attr_init(&pthread_custom_attr);

 p=(parm *)malloc(sizeof(parm)*n);
 /* Start up thread */

 for (i = 0; i < n; i++)
 {
  p[i].id = i;
  p[i].nproc = n;
  pthread_create(&threads[i], &pthread_custom_attr, greeting, (void *)(p+i));
 }
 /* Synchronize the completion of each thread. */

 for (i = 0; i < n; i++)
 {
  pthread_join(threads[i], NULL);
 }
 free(p);
}


OUTPUT

gcc -o pthread_greeting pthread_greeting.c -lpthread
./pthread_greeting 10

Greetings from process 1!
Greetings from process 7!
Greetings from process 4!
Greetings from process 3!
Greetings from process 2!
Greetings from process 5!
Greetings from process 6!
Greetings from process 9!
Greetings from process 8!

Post a Comment

0Comments

Post a Comment (0)