 Open in App
Not now

# Print 1 2 3 infinitely using threads in C

• Difficulty Level : Expert
• Last Updated : 22 Jul, 2019

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 ......
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 ` `#include ` ` `  `// 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 ...
```

My Personal Notes arrow_drop_up
Related Articles