यहां हम देखेंगे कि विभिन्न थ्रेड्स का उपयोग करके संख्याओं को सही क्रम में कैसे प्रिंट किया जाए। यहां हम थ्रेड्स की संख्या बनाएंगे, फिर उन्हें सिंक्रोनाइज़ करेंगे। विचार यह है कि पहला धागा 1 प्रिंट करेगा, फिर दूसरा धागा 2 प्रिंट करेगा और इसी तरह। जब एक थ्रेड प्रिंट करने का प्रयास कर रहा होता है, तो यह संसाधन को लॉक कर देगा, इसलिए कोई भी थ्रेड उस हिस्से का उपयोग नहीं कर सकता है।
उदाहरण
#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 count = 0;
void* sync_thread(void* num) { //this function is used to synchronize the threads
int thread_number = *(int*)num;
while (1) {
pthread_mutex_lock(&mutex); //lock the section
if (thread_number != count) { //if the thread number is not same as count, put all thread
except one into waiting state
pthread_cond_wait(&cond[thread_number], &mutex);
}
printf("%d ", thread_number + 1); //print the thread number
count = (count+1)%(threads);
// notify the next thread
pthread_cond_signal(&cond[count]);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t* thread_id;
volatile int i;
int* thread_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);
thread_id = (pthread_t*)malloc(sizeof(pthread_t) * threads);
thread_arr = (int*)malloc(sizeof(int) * threads);
for (i = 0; i < threads; i++) { //create threads
thread_arr[i] = i;
pthread_create(&thread_id[i], NULL, sync_thread, (void*)&thread_arr[i]);
}
// waiting for thread
for (i = 0; i < threads; i++) {
pthread_join(thread_id[i], NULL);
}
return 0;
} आउटपुट
$ g++ test.cpp -lpthread $ ./a.out Enter number of threads: 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 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 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 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 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 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 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 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 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 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 ... ... ...