Open In App

Print 1 2 3 infinitely using threads in C

Last Updated : 22 Jul, 2019
Improve
Improve
Like Article
Like
Save
Share
Report

Print 1 2 3 infinitely using thread. Create three threads viz T1, T2, and T3 such that those should print 1 2 3 sequence infinitely.

Examples :

Output :1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 ......

Prerequisite : Threads in C

Approach :

  • Start an infinite loop and initialize a variable ‘done’ to 1.
  • Now, check for the value of done is not equal to 1.
  • If it is hold wait condition lock, else print n and respectively signal the next consecutive n.




// C code to print 1 2 3 infinitely using pthread
#include <stdio.h>
#include <pthread.h>
  
// Declaration of thread condition variables
pthread_cond_t cond1  = 
               PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2  = 
               PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3  = 
               PTHREAD_COND_INITIALIZER;
  
// mutex which we are going to
// use avoid race condition.
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
   
// done is a global variable which decides 
// which waiting thread should be scheduled
int done = 1;
   
// Thread function
void *foo(void *n)
{
        while(1) {
                  
                // acquire a lock
                pthread_mutex_lock(&lock);
                   
                if (done != (int)*(int*)n) {
                          
                        // value of done and n is not equal,
                        // hold wait lock on condition variable
                        if ((int)*(int*)n == 1) {
                                pthread_cond_wait(&cond1, &lock);
                        } else if ((int)*(int*)n == 2) {
                                pthread_cond_wait(&cond2, &lock);
                        }
                        else {
                                pthread_cond_wait(&cond3, &lock);
                        }
   
                }
                // done is equal to n, then print n
                printf("%d  ", *(int*)n);
   
                // Now time to schedule next thread accordingly 
                // using pthread_cond_signal()
                if (done == 3) {
                        done = 1;
                        pthread_cond_signal(&cond1);
                }
                else if(done == 1) {
                        done = 2;
                        pthread_cond_signal(&cond2);
                } else if (done == 2) {
                        done = 3;
                        pthread_cond_signal(&cond3);
                }
                  
                // Finally release mutex
                pthread_mutex_unlock(&lock);
        }
   
        return NULL;
}
  
// Driver code
int main()
{
        pthread_t  tid1, tid2, tid3;
        int n1 = 1, n2 = 2, n3 = 3;
          
        // Create 3 threads 
        pthread_create(&tid1, NULL, foo, (void *)&n1);
        pthread_create(&tid2, NULL, foo, (void *)&n2);
        pthread_create(&tid3, NULL, foo, (void *)&n3);
          
        // infinite loop to avoid exit of a program/process
        while(1);
          
        return 0;
}


Output :

1 2 3 1 2 3 1 2 3 1 2 3 ...


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads