यहां हम देखेंगे कि अलग-अलग थ्रेड्स का उपयोग करके संख्याओं को सही क्रम में कैसे प्रिंट किया जाए। यहां हम n संख्या में थ्रेड्स बनाएंगे, फिर उन्हें सिंक्रोनाइज़ करेंगे। विचार यह है कि पहला थ्रेड 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) {
// यह फ़ंक्शन थ्रेड्स को सिंक्रोनाइज़ करने के लिए उपयोग किया जाता है
int thread_number = *(int*)num;
while (1) {
pthread_mutex_lock(&mutex); // सेक्शन लॉक करें
if (thread_number != count) { // यदि थ्रेड नंबर काउंट के समान नहीं है, तो एक को छोड़कर सभी थ्रेड्स को प्रतीक्षा अवस्था में डालें
pthread_cond_wait(&cond[thread_number], &mutex);
}
printf("%d ", thread_number + 1); // थ्रेड नंबर प्रिंट करें
count = (count + 1) % (threads);
// अगले थ्रेड को सूचित करें
pthread_cond_signal(&cond[count]);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t* thread_id;
volatile int i;
int* thread_arr;
printf("\nथ्रेड्स की संख्या दर्ज करें: ");
scanf("%d", &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++) { // थ्रेड्स बनाएं
thread_arr[i] = i;
pthread_create(&thread_id[i], NULL, sync_thread, (void*)&thread_arr[i]);
}
// थ्रेड की प्रतीक्षा
for (i = 0; i < threads; i++) {
pthread_join(thread_id[i], NULL);
}
return 0;
}
आउटपुट
$ g++ test.cpp -lpthread $ ./a.out थ्रेड्स की संख्या दर्ज करें: 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 ...