# Print numbers in sequence using thread synchronization

• Difficulty Level : Hard
• Last Updated : 23 Dec, 2021

The problem is to synchronize n number of threads using pthread library. The idea is take thread count and print 1 in first thread, print 2 in second thread, print 3 in third thread, ….. print n in nth thread and again repeat from thread 1 infinitely.

Examples :

```Input : Thread count
Output : 1 2 3 ... thread count 1 2 3 ... thread
count 1 2 3 ... thread count ....

Input : 5
Output : 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
1 2 3 4 5 1 2 3 4 5 ....```

Below is the implementation:

## CPP

 `// C code to synchronize threads``#include ``#include ``#include ``#include `` ` `pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;``pthread_cond_t* cond = NULL;`` ` `int` `threads;``volatile` `int` `cnt = 0;`` ` `// function to synchronize threads``void``* foo(``void``* arg)``{``    ``// turn is a basically to identify a thread``    ``int` `turn = *(``int``*)arg;`` ` `    ``while` `(1) {``        ``pthread_mutex_lock(&mutex);`` ` `        ``// cnt is used to determine which thread should``        ``// enter into critical section(printf() statement)``        ``if` `(turn != cnt) {`` ` `            ``// put all thread except one thread in waiting``            ``// state``            ``pthread_cond_wait(&cond[turn], &mutex);``        ``}`` ` `        ``// it's a time to print turn can have``        ``// values starting from 0. Hence + 1``        ``printf``(``"%d "``, turn + 1);`` ` `        ``// determine which thread need to be scheduled now``        ``if` `(cnt < threads - 1) {``            ``cnt++;``        ``}``        ``else` `{``            ``cnt = 0;``        ``}`` ` `        ``// wake up next thread``        ``pthread_cond_signal(&cond[cnt]);``        ``pthread_mutex_unlock(&mutex);``    ``}`` ` `    ``return` `NULL;``}`` ` `// Driver code``int` `main()``{``    ``pthread_t* tid;``    ``volatile` `int` `i;``    ``int``* arr;`` ` `    ``printf``(``"\nEnter number of threads: "``);``    ``scanf``(``"%d"``, &threads);`` ` `    ``// allocate memory to cond (conditional variable),``    ``// thread id's and array of size threads``    ``cond = (pthread_cond_t*)``malloc``(``sizeof``(pthread_cond_t)``                                   ``* threads);``    ``tid = (pthread_t*)``malloc``(``sizeof``(pthread_t) * threads);``    ``arr = (``int``*)``malloc``(``sizeof``(``int``) * threads);`` ` `    ``// Initialize cond (conditional variable)``    ``for` `(``int` `i = 0; i < threads; i++) {``        ``if` `(pthread_cond_init(&cond[i], NULL) != 0) {``            ``perror``(``"pthread_cond_init() error"``);``            ``exit``(1);``        ``}``    ``}`` ` `    ``// create threads``    ``for` `(i = 0; i < threads; i++) {``        ``arr[i] = i;``        ``pthread_create(&tid[i], NULL, foo, (``void``*)&arr[i]);``    ``}`` ` `    ``// waiting for thread``    ``for` `(i = 0; i < threads; i++) {``        ``pthread_join(tid[i], NULL);``    ``}`` ` `    ``return` `0;``}`

Output : My Personal Notes arrow_drop_up