2013-07-12 10 views
10

मैं C++ एक ThreadPool विकसित करने के लिए कोशिश करते हैं और मुझे आश्चर्य है अगर यह बेहतर है कार्यकर्ता धागे के मुख्य पाश में उपज के लिए() धागे या एक शर्त चर पर प्रतीक्षा करने के लिए:ThreadPool कार्यान्वयन: condition_variables बनाम उपज()

void worker_thread(void) 
{ 
    // this is more or less pseudocode 
    while(!done) 
    { 

     if(task_available) 
      run_task(); 
     else 
      std::this_thread::yield(); 
    } 
} 
बनाम

void worker_thread(void) 
{ 
    // this is more or less pseudocode 

    std::unique_lock<std::mutex> lk(mutex_); 
    while(!done) 
    { 

     if(task_available) 
      run_task(); 
     else 
      condition_.wait(lk); 
    } 
} 

कोई भी विचार

? क्या दोनों संस्करणों के बीच कोई प्रदर्शन अंतर होगा?

उत्तर

7

यदि थ्रेड पूल में अपने धागे लगातार कार्यों के साथ तंग आ चुके हैं और आप तेजी से प्रतिक्रिया समय की जरूरत है, तो उपज तुम क्या चाहते है, लेकिन उपज कोई बात नहीं क्या इंतजार कर धागा कर रही है CPU चक्र जला होगा। यदि नहीं, तो आप सशर्त दृष्टिकोण का उपयोग कर सकते हैं, जब तक कोई कार्य तैयार नहीं हो जाता है, तब तक धागे सोएंगे (ध्यान दें, एक सशर्त धागा जगा सकता है, भले ही कोई तैयार सिग्नल भेजा न हो), प्रतिक्रिया समय धीमा हो सकता है, लेकिन आप नहीं करेंगे सीपीयू चक्र जलाओ।

मैं सशर्त दृष्टिकोण की अनुशंसा करता हूं, और यदि प्रतिक्रिया समय बहुत धीमा है, तो उपज पर स्विच करें।

+1

सशर्त दृष्टिकोण कैसे कार्यान्वित किया जाता है? क्या उनके पास एक समान प्रतीक्षा तंत्र है जो वर्कर_थ्रेड ऊपर है? – headmyshoulder

+1

उपज कॉलिंग थ्रेड को अन्य प्रोसेसर पर चलाने के लिए तैयार होने वाले अन्य थ्रेड पर निष्पादन उत्पन्न करने का कारण बनता है (विंडोज़ के लिए स्विचटो थ्रेड देखें)। सशर्त के लिए –

+0

, pthread_cond_wait देखें। इसलिए यह थ्रेड को नींद की स्थिति में प्रवेश करने का कारण बनता है जब तक कि सशर्त निकाल दिया जाता है (विंडोज़ पर एक घटना की तरह) –

5

थ्रेड स्विच की लागत एक ही तरह से है। इस बात के लिए कि क्या आपको मतदान या हालत चर का उपयोग करना चाहिए, बाद में प्रोसेसर को धागे को लात मारकर आराम कर सकते हैं जब तक कि वास्तव में कुछ करने के लिए नहीं किया जाता है। इसके परिणामस्वरूप कम CPU उपयोग होता है। मतदान विधि धागे को वापस करने की अनुमति देगी और "पुनः प्रयास करें", प्रभावी रूप से CPU को अनिश्चित काल तक चलाना।

यह बिंदु बाहर कुछ अनुप्रयोगों कि मतदान को पसंद करते हैं, जैसे जब task_available समय के बहुत ही कम मात्रा के लिए गलत है (अर्थात वहाँ आम तौर पर ऐसा करने के लिए काम करते हैं) देखते हैं कि लायक। उस स्थिति में, आप एक काउंटर के साथ एक लूप में task_available मतदान करना चाहते हैं; जब काउंटर थ्रेसहोल्ड से अधिक हो तो केवल थ्रेड उत्पन्न करें।

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