2010-10-21 26 views
41

उत्पादन कोड (बूस्ट जैसे कुछ) में उपयोग करने के लिए सी ++ के लिए थ्रेड पूल का अच्छा ओपन सोर्स कार्यान्वयन क्या है?सी ++ थ्रेड पूल

कृपया अपना स्वयं का उदाहरण कोड या उदाहरण कोड उपयोग के लिए एक लिंक प्रदान करें।

+0

प्रदर्शन के साथ समस्या क्या है? –

+5

@ डेविड - बूस्ट में कोई अंतर्निहित थ्रेडपूल नहीं है, है ना? –

+0

@ स्टेव टाउनसेंड: ठीक है, माफ करना ... मैंने सोचा कि मुझे बढ़ावा में एक याद है, लेकिन यह वास्तव में शामिल नहीं है (स्वीकार नहीं किया गया है)। Http://threadpool.sourceforge.net/index.html –

उत्तर

21

मुझे लगता है कि यह अभी भी बूस्ट में स्वीकार नहीं किया गया है, लेकिन एक अच्छा सितारा बिंदु: threadpool। उपयोग के कुछ उदाहरण, वेब साइट से:

#include "threadpool.hpp" 

using namespace boost::threadpool; 

// Some example tasks 
void first_task() 
{ 
    ... 
} 

void second_task() 
{ 
    ... 
} 

void third_task() 
{ 
    ... 
} 

void execute_with_threadpool() 
{ 
    // Create a thread pool. 
    pool tp(2); 

    // Add some tasks to the pool. 
    tp.schedule(&first_task); 
    tp.schedule(&second_task); 
    tp.schedule(&third_task); 

    // Leave this function and wait until all tasks are finished. 
} 

तर्क "2" पूल के लिए थ्रेड की संख्या इंगित करता है। इस मामले में, tp का विनाश सभी धागे खत्म होने की प्रतीक्षा करता है।

+1

कथन में '2' का अर्थ क्या है 'पूल टीपी (2);'? – Arun

+0

@ अरुणसाहा: प्रारंभिक धागे की संख्या इंगित करता है। मैं इसे उत्तर में जोड़ दूंगा। –

+0

यह थ्रेड पूलिंग लाइब्रेरी प्रोजेक्ट कुछ विचार दे सकता है। -> https://code.google.com/p/threadpool11/ – Etherealone

9

आप http://threadpool.sourceforge.net/

को देखने के लिए यह thread pool खुद Boost.Thread का उपयोग कर लागू करने के लिए कठिन नहीं है चाहते हो सकता है। कार्य के आधार पर, आप Standard Template Library से एक के बजाय कतार के लिए lock-free कंटेनर का उपयोग करना चाह सकते हैं। उदाहरण के लिए, fifolock free लाइब्रेरी से कंटेनर।

गुड लक!

0

This library बूस्ट पर बनाता है। पढ़ना। कुछ उदाहरण कोड के साथ short tutorial है। यदि यह वही नहीं करता जो आप चाहते हैं, तो आप इसे आधारभूत आधार के रूप में उपयोग कर सकते हैं।

सुनिश्चित करें कि आप बूस्ट संस्करण> = 1.37 पर हैं यदि आप इस मार्ग पर जाते हैं।

3

मेरा मानना ​​है कि आप boost :: asio में io_service के साथ थ्रेड पूल का अनुकरण कर सकते हैं। आप io_service पूल में उपलब्ध थ्रेड की संख्या को नियंत्रित कर सकते हैं, और फिर आप io_service पर कार्यों को "पोस्ट" कर सकते हैं, जो पूल में किसी थ्रेड द्वारा निष्पादित किया जाएगा। इस तरह के प्रत्येक कार्य को एक मजेदार होना चाहिए (मुझे विश्वास है)।

मैं अभी यहां एक उदाहरण नहीं डाल सकता, लेकिन io_service पूल पर एएसओ दस्तावेज यह बताएगा कि यह कैसे किया जा सकता है।

0

ffead-cpp ढांचे का उपयोग करके एक उदाहरण कार्यान्वयन here का वर्णन किया गया है। यह प्रत्यक्ष, प्राथमिकता-आधारित के साथ-साथ अनुसूचित थ्रेड पूल कार्यान्वयन प्रदान करता है। इसे देखें ...

7

मैंने एक छोटा उदाहरण here लिखा है।

asio::io_service io_service; 
boost::thread_group threads; 
auto_ptr<asio::io_service::work> work(new asio::io_service::work(io_service)); 

// Spawn enough worker threads 
int cores_number = boost::thread::hardware_concurrency(); 
for (std::size_t i = 0; i < cores_number; ++i){ 
    threads.create_thread(boost::bind(&asio::io_service::run, &io_service)); 
} 
// Post the tasks to the io_service 
for(vector<string>::iterator it=tasks.begin();it!=tasks.end();it++){ 
    io_service.dispatch(/* YOUR operator()() here */); 
} 
work.reset(); 
1

यहाँ एक सरल हेडर केवल काम के लिए एक थ्रेड पूल का उपयोग कर कतार है (बूस्ट पर बनाया गया): taskqueue.hpp

TaskQueue project page एक नमूना भी शामिल है मूल रूप से आप क्या करने की जरूरत कोड के इस टुकड़े को लागू करने की है आवेदन how to use it:

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