मल्टीथ्रेडिंग मल्टीटास्किंग का एक विशेष रूप है और मल्टीटास्किंग वह सुविधा है जो आपके कंप्यूटर को दो या दो से अधिक प्रोग्राम एक साथ चलाने की अनुमति देती है। सामान्य तौर पर, मल्टीटास्किंग दो प्रकार की होती है:प्रक्रिया-आधारित और थ्रेड-आधारित।
प्रक्रिया-आधारित मल्टीटास्किंग कार्यक्रमों के समवर्ती निष्पादन को संभालती है। थ्रेड-आधारित मल्टीटास्किंग एक ही प्रोग्राम के टुकड़ों के समवर्ती निष्पादन से संबंधित है।
एक मल्टीथ्रेडेड प्रोग्राम में दो या दो से अधिक भाग होते हैं जो एक साथ चल सकते हैं। ऐसे प्रोग्राम के प्रत्येक भाग को थ्रेड कहा जाता है, और प्रत्येक थ्रेड निष्पादन के एक अलग पथ को परिभाषित करता है।
C में बहु-थ्रेडेड अनुप्रयोगों के लिए कोई अंतर्निहित समर्थन नहीं है। इसके बजाय, यह सुविधा प्रदान करने के लिए यह पूरी तरह से ऑपरेटिंग सिस्टम पर निर्भर करता है।
यह ट्यूटोरियल मानता है कि आप Linux OS पर काम कर रहे हैं और हम POSIX का उपयोग करके मल्टी-थ्रेडेड C प्रोग्राम लिखने जा रहे हैं। POSIX थ्रेड्स, या Pthreads API प्रदान करता है जो कई यूनिक्स-जैसे POSIX सिस्टम जैसे कि FreeBSD, NetBSD, GNU/Linux, Mac OS X और Solaris पर उपलब्ध हैं।
POSIX थ्रेड बनाने के लिए निम्न रूटीन का उपयोग किया जाता है -
#include <pthread.h> pthread_create (thread, attr, start_routine, arg)
यहां, pthread_create एक नया धागा बनाता है और इसे निष्पादन योग्य बनाता है। इस रूटीन को आपके कोड में कहीं से भी कितनी बार कॉल किया जा सकता है। यहाँ मापदंडों का विवरण दिया गया है।
पैरामीटर | <थ>विवरण|
---|---|
धागा | सबरूटीन द्वारा लौटाए गए नए थ्रेड के लिए एक अपारदर्शी, अद्वितीय पहचानकर्ता। |
attr | एक अपारदर्शी विशेषता वस्तु जिसका उपयोग थ्रेड विशेषताओं को सेट करने के लिए किया जा सकता है। आप डिफ़ॉल्ट मानों के लिए एक थ्रेड विशेषता ऑब्जेक्ट, या NULL निर्दिष्ट कर सकते हैं। |
प्रारंभ_रूटीन | सी रूटीन जिसे थ्रेड बनाने के बाद निष्पादित किया जाएगा। |
तर्क | एक एकल तर्क जो start_routine को पारित किया जा सकता है। इसे शून्य प्रकार के पॉइंटर कास्ट के रूप में संदर्भ द्वारा पारित किया जाना चाहिए। यदि कोई तर्क पारित नहीं करना है तो NULL का उपयोग किया जा सकता है। |
किसी प्रक्रिया द्वारा बनाए जा सकने वाले थ्रेड्स की अधिकतम संख्या कार्यान्वयन पर निर्भर है। एक बार बनने के बाद, थ्रेड्स पीयर होते हैं, और अन्य थ्रेड्स बना सकते हैं। थ्रेड्स के बीच कोई अंतर्निहित पदानुक्रम या निर्भरता नहीं है।
टर्मिनेटिंग थ्रेड्स
निम्नलिखित दिनचर्या है जिसका उपयोग हम POSIX थ्रेड को समाप्त करने के लिए करते हैं -
#include <pthread.h> pthread_exit (status)
यहां pthread_exit थ्रेड से स्पष्ट रूप से बाहर निकलने के लिए उपयोग किया जाता है। आमतौर पर, pthread_exit() रूटीन को तब कहा जाता है जब एक थ्रेड अपना काम पूरा कर लेता है और अब उसके अस्तित्व की आवश्यकता नहीं है।
यदि मुख्य () थ्रेड द्वारा बनाए गए थ्रेड से पहले समाप्त होता है, और pthread_exit () के साथ बाहर निकलता है, तो अन्य थ्रेड निष्पादित होते रहेंगे। अन्यथा, मुख्य () समाप्त होने पर वे स्वचालित रूप से समाप्त हो जाएंगे।
उदाहरण कोड
#include <iostream> #include <cstdlib> #include <pthread.h> using namespace std; #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! Thread ID, %d\n", tid); pthread_exit(NULL); } int main () { pthread_t threads[NUM_THREADS]; int rc; int i; for( i = 0; i < NUM_THREADS; i++ ) { cout << "main() : creating thread, " << i << endl; rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i); if (rc) { printf("Error:unable to create thread, %d\n", rc); exit(-1); } } pthread_exit(NULL); }
आउटपुट
$gcc test.cpp -lpthread $./a.out main() : creating thread, 0 main() : creating thread, 1 main() : creating thread, 2 main() : creating thread, 3 main() : creating thread, 4 Hello World! Thread ID, 0 Hello World! Thread ID, 1 Hello World! Thread ID, 2 Hello World! Thread ID, 3 Hello World! Thread ID, 4