El problema es sincronizar n número de subprocesos utilizando la biblioteca pthread. La idea es tomar el número de hilos e imprimir 1 en el primer hilo, imprimir 2 en el segundo hilo, imprimir 3 en el tercer hilo, ….. imprimir n en el enésimo hilo y nuevamente repetir desde el hilo 1 infinitamente.
Requisito previo: subprocesamiento múltiple
Ejemplos:
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 ....
A continuación se muestra la implementación:
CPP
// C code to synchronize threads #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> 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; }
Producción :