2013-05-16 26 views
9

Để bắt đầu với boost::thread, tôi đã viết một ví dụ rất đơn giản - không hoạt động. Ai có thể chỉ ra sai lầm của tôi?boost :: thread - Ví dụ đơn giản không hoạt động (C++)

Tôi đã viết một lớp functor rất đơn giản để thực hiện công việc. Đó là nghĩa vụ để tính tổng của một std::vector của đôi, và đưa cho tôi một cách để có được kết quả sau:

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; 
    } 
}; 

Bây giờ, tôi có thể tính toán số tiền theo một trong hai cách. Nếu tôi làm điều đó trong chủ đề chính, như,

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

thì mọi thứ đều hoạt động. Tuy nhiên, nếu tôi cố gắng làm điều này trong một chủ đề riêng biệt (toàn bộ điểm),

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 

... thì nó không hoạt động.

Xin lỗi nếu điều này là hiển nhiên, nhưng tôi bị bối rối. Bất kì manh mối nào?

Trả lời

13

Bạn nên sử dụng

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

từ bởi thread bản mặc định những lập luận này.