9

首先boost::thread,我编写了一个非常简单的示例——它不起作用。谁能指出我的错误?

我编写了一个非常简单的仿函数类型的类来完成这项工作。它应该计算std::vector双打的总和,并给我一种稍后获得结果的方法:

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

现在,我可以通过两种方式之一来计算总和。如果我在主线程中执行此操作,例如,

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

......然后它不起作用。

对不起,如果这很明显,但我很难过。有什么线索吗?

4

2 回答 2

13

你应该使用

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

因为默认情况下线程复制这些参数。

于 2013-05-16T14:21:45.827 回答
5

您的 SumWorker 对象 S 正在被线程构造函数复制,因此它的成员永远不会更新。

http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html#thread.thread_management.thread.callable_constructor

于 2013-05-16T14:21:39.980 回答