为了开始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;
}
};
Run Code Online (Sandbox Code Playgroud)
现在,我可以通过两种方式之一计算总和.如果我在主线程中这样做,比如,
SumWorker S;
S(numbers); // "numbers" is an std::vector<double>
double sum = S.value(); // "sum" now contains the sum
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,如果我尝试在一个单独的线程中执行此操作(这是重点),
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
Run Code Online (Sandbox Code Playgroud)
...然后它不起作用.
对不起,如果这是显而易见的,但我很难过.有线索吗?
For*_*veR 13
你应该用
boost::thread thread(boost::ref(S), boost::cref(numbers));
Run Code Online (Sandbox Code Playgroud)
因为默认情况下线程复制这些参数.
您的SumWorker对象S正由线程构造函数复制,因此其成员永远不会更新.
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |