Keyboard Shortcuts N Next post
P Previous post
S Save / unsave
R Read aloud
T Toggle theme
/ Focus search
Esc Close panels
🔥
Ready to read...
C C-Programming Programs Pthread

C Programming For Greeting Using Pthread

Reviewed & accurate
AI Summary
#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!
Test Your Knowledge
How did you find this?

Comments

Join the discussion! Sign in with your Google or Blogger account, or comment as Anonymous - no account needed. For quick questions, also reach me on Telegram @cytestch.

Comments