के साथ QtConcurrent बनाम QThread का मल्टीथ्रेडिंग प्रदर्शन मान लीजिए कि आपके एप्लिकेशन को एकाधिक थ्रेड में फ़ंक्शन चलाने की आवश्यकता है, जिसकी संख्या CPU कोर/थ्रेड की संख्या से अधिक है।कई थ्रेड
for(int i=0;i<30;i++)
{
MyClass *obj = new MyClass;
QThread *th = new QThread();
obj->moveToThread(th);
connect(th, SIGNAL(started()), obj, SLOT(someFunction()));
connect(obj, SIGNAL(workFinished()), th, SLOT(quit()));
connect(th, SIGNAL(finished()), obj, SLOT(deleteLater()));
connect(th, SIGNAL(finished()), th, SLOT(deleteLater()));
th->start();
}
धागे की संख्या के रूप में और अधिक कर रहे हैं:
MyClass *obj = new MyClass;
QThreadPool::globalInstance()->setMaxThreadCount(30);
for(int i=0;i<30;i++)
QtConcurrent::run(obj, &MyClass::someFunction);
एक और तरीका है एक से अधिक ऑब्जेक्ट moveToThread
का उपयोग कर सकते हैं और विभिन्न धागे को स्थानांतरित करने के लिए है: एक तरह से QtConcurrent
उपयोग करें और अधिकतम धागा गिनती की स्थापना करने के लिए है सीपीयू कोर की संख्या से, चलते समय विभिन्न कोरों के बीच धागे को स्विच किया जाना चाहिए।
सवाल यह है कि क्या दोनों दृष्टिकोणों के अलग-अलग प्रदर्शन हैं या नहीं? i.e QThread
का स्विचिंग QtConcurrent::run
का उपयोग करके चलाए जाने वाले एक से अलग है?
यह प्रत्येक धागे पर निर्भर करता है। अंगूठे का नियम: सीपीयू बाध्य धागे के लिए कोर की तुलना में अधिक धागे समग्र प्रदर्शन में कमी आएंगे; I/O बाउंड थ्रेड के लिए उपलब्ध कोर से अधिक धागे होना संभव है। आपको मापने की जरूरत है। –
@ रिचर्ड क्रिटन आप सही हैं, लेकिन यहां प्रश्न यह है कि 'क्यूटी कोंकंटेंट' और 'क्यू थ्रेड' स्विचिंग समय के बीच का अंतर है। – Nejat
आपके उपयोग के मामले पर निर्भर करता है।हमेशा के रूप में, यह देखने के लिए उपाय करें कि क्या यह आपकी स्थिति में कोई फर्क पड़ता है। QConcurrent QThreads के आस-पास की सुविधा है, अंतर इस बात पर झूठ बोलेंगे कि कार्य कैसे निर्धारित किए जाते हैं और संसाधनों का उपयोग किया जाता है, संदर्भ स्विचिंग समय में नहीं। अपना खुद का समाधान लिखने से आपको और अधिक लचीलापन मिलेगा, लेकिन निश्चित रूप से और भी अधिक काम और अधिक कीड़े। –