2015-06-06 3 views
11

के साथ 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 का उपयोग करके चलाए जाने वाले एक से अलग है?

+0

यह प्रत्येक धागे पर निर्भर करता है। अंगूठे का नियम: सीपीयू बाध्य धागे के लिए कोर की तुलना में अधिक धागे समग्र प्रदर्शन में कमी आएंगे; I/O बाउंड थ्रेड के लिए उपलब्ध कोर से अधिक धागे होना संभव है। आपको मापने की जरूरत है। –

+0

@ रिचर्ड क्रिटन आप सही हैं, लेकिन यहां प्रश्न यह है कि 'क्यूटी कोंकंटेंट' और 'क्यू थ्रेड' स्विचिंग समय के बीच का अंतर है। – Nejat

+0

आपके उपयोग के मामले पर निर्भर करता है।हमेशा के रूप में, यह देखने के लिए उपाय करें कि क्या यह आपकी स्थिति में कोई फर्क पड़ता है। QConcurrent QThreads के आस-पास की सुविधा है, अंतर इस बात पर झूठ बोलेंगे कि कार्य कैसे निर्धारित किए जाते हैं और संसाधनों का उपयोग किया जाता है, संदर्भ स्विचिंग समय में नहीं। अपना खुद का समाधान लिखने से आपको और अधिक लचीलापन मिलेगा, लेकिन निश्चित रूप से और भी अधिक काम और अधिक कीड़े। –

उत्तर

10

मैं पहले उत्तर से सहमत हूं, लेकिन मैं कुछ जोड़ना चाहता हूं।

QThread निम्न स्तर की कक्षा है जो केवल ओएस-विशिष्ट कार्यों को चलाती है। QtConcurrent क्या है? उत्तर Qt स्रोत कोड में है।

प्रथम स्तर: run

QFuture<T> run(T (*functionPointer)()) 
{ 
     return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start(); 
} 

Second:

struct StoredFunctorCall0: public RunFunctionTask<T> { ... 

Third:

template <typename T> 
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable 
{ ... 

अब के बारे में QRunnable। जब हम QThreadPool साथ QRunnable शुरू हम करते हैं:

start() जो tryStart() जो startThread() जिसके साथ QThreadPoolThread (और यह एक QThread subclass है) संचालित कॉल कॉल करता है और यह अंत में QThread की start() फोन कर रहा है।

और निश्चित रूप से यह श्रृंखला पूर्ण, लंबी सड़क नहीं है, है ना? इसलिए जैसा कि मुझे पता है, जब हम अमूर्तता का उपयोग करते हैं, तो हमारे पास अमूर्त जुर्माना होता है (QtConcurrent में QThread का बड़ा जुर्माना है), लेकिन अंतिम परिणाम समान है, यह QThread है।

+0

धन्यवाद। तो अगर वे सभी 'QThread' हैं तो मुझे लगता है कि दौड़ने के बाद दोनों के बीच बहुत अंतर नहीं है। – Nejat

7

संक्षिप्त उत्तर: यह वर्कलोड की प्रकृति/तर्क पर निर्भर करता है।

QtConcurrent धागे का एक पूल से चलाता है और यह एक उच्च स्तर एपीआई नहीं अवरुद्ध संचालन की एक बड़ी संख्या को चलाने के लिए अच्छी तरह से अनुकूल है: आप जल्द ही पूल से समाप्त हो रही है और हो रही है खत्म हो जाएगा अगर आप संचालन अवरुद्ध करने का एक बहुत कुछ कर अन्य अनुरोध कतारबद्ध उस स्थिति में QThread (निचला स्तर का निर्माण) शायद ऑपरेशन के लिए बेहतर अनुकूल है (प्रत्येक एक एकल धागे का प्रतिनिधित्व करता है)।

+0

मैंने प्रदान किए गए उदाहरण में, थ्रेड पूल में थ्रेड की अधिकतम संख्या को बड़ी संख्या में सेट किया गया है, इसलिए इसे निकाला नहीं जाएगा और सभी धागे बिना कतार के चलाए जाते हैं। इसके अलावा दोनों दृष्टिकोणों की प्रक्रिया की प्रकृति/तर्क समान हैं और वे कोड का एक ही टुकड़ा चला रहे हैं। – Nejat

+0

@Nejat 'बड़ी संख्या' आपके द्वारा निर्धारित अधिकतम संख्या के संबंध में है। वर्कलोड की प्रकृति इस प्रश्न में निर्दिष्ट नहीं है इसलिए कोई विश्लेषण प्रदान करने के लिए पर्याप्त जानकारी नहीं है। आपको इसे स्वयं बेंचमार्क करना होगा। –

संबंधित मुद्दे