2013-05-16 4 views
9

boost::thread के साथ शुरू करने के लिए, मैंने एक बहुत ही सरल उदाहरण लिखा है - जो काम नहीं करता है। क्या कोई मेरी गलती को इंगित कर सकता है?बूस्ट :: थ्रेड - सरल उदाहरण काम नहीं करता है (सी ++)

मैंने काम करने के लिए एक बहुत ही साधारण मज़ेदार-प्रकार की कक्षा लिखी।

class SumWorker 
{ 
private: 
    double _sum; 
public: 

    SumWorker() : _sum(-1.0) {} 

    void operator() (std::vector<double> const & arr) 
    { 
     _sum = 0.0; 
     for(std::vector<double>::const_iterator i = arr.begin(); 
      i != arr.end(); 
      i++) 
     { 
      _sum += (*i); 
     } 
    } 

    double const value() const 
    { 
     return _sum; 
    } 
}; 

अब, मैं दो तरीकों में से एक में राशि की गणना कर सकता: यह युगल के एक std::vector की राशि की गणना करने के लिए, और मुझे बाद में परिणाम प्राप्त करने का तरीका बताते हैं चाहिए था। यदि मैं इसे मुख्य धागे के भीतर करता हूं, जैसे

SumWorker S; 
S(numbers);    // "numbers" is an std::vector<double> 
double sum = S.value(); // "sum" now contains the sum 

तब सब कुछ काम करता है। हालांकि, अगर मैं इसे एक अलग धागे (जो पूरे बिंदु पर था) में करने की कोशिश करता है,

SumWorker S; 
boost::thread thread(S, numbers); // Should be equivalent to "S(numbers);" 
thread.join();     // Wait for thread to finish 
double sum = S.value();   // "sum" now contains -1.0 

... तो यह काम नहीं करता है।

क्षमा करें अगर यह स्पष्ट है, लेकिन मैं stumped हूँ। कोई सुराग?

उत्तर

13

आप डिफ़ॉल्ट धागा प्रतियां इन तर्कों से के बाद से

boost::thread thread(boost::ref(S), boost::cref(numbers)); 

उपयोग करना चाहिए।

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