错误:表达式必须是可修改的左值

时间:2014-03-11 11:08:47

标签: c++ tbb lvalue

当我尝试为x_dev,y_dev和pearson分配值时,我一直在for循环中出现此错误。据我所知,它们都应该可以修改。谁能看到我出错的地方?

class LoopBody
{  
    double *const x_data;
    double *const y_data;
    double const x_mean;
    double const y_mean;  
    double x_dev;
    double y_dev;
    double pearson; 


public:
    LoopBody(double *x, double *y, double xmean, double ymean, double xdev, double ydev, double pear) 
            : x_data(x), y_data(y), x_mean(xmean), y_mean(ymean), x_dev(xdev), y_dev(ydev), pearson(pear) {}  

    void operator() (const blocked_range<size_t> &r) const {              
        for(size_t i = r.begin(); i != r.end(); i++)
        {
            double x_temp = x_data[i] - x_mean;
            double y_temp = y_data[i] - y_mean;

            x_dev += x_temp * x_temp;
            y_dev += y_temp * y_temp;

            pearson += x_temp * y_temp;

        }
    }
};

遵循@Bathsheba的建议我已经克服了这些问题。但是,当运行parallel_for运行时,运行但从不输入for循环。

这就是我所说的parallel_for:

parallel_for(blocked_range<size_t>(0,n), LoopBody(x, y, x_mean, y_mean, x_dev, y_dev, pearson), auto_partitioner());

2 个答案:

答案 0 :(得分:2)

()运算符标记为const,您尝试修改类成员数据(例如x_devy_devperson) 。这是不允许的,这也是您收到编译时错误的原因。

您可能希望从方法中删除const

或者,您可以将要修改的成员数据标记为mutable,但这不是首选解决方案,因为它会使代码变得脆弱,难以阅读并且可能会对多线程造成严重破坏。

答案 1 :(得分:2)

看起来你想做缩减,即计算一些数据的聚合值。

为此,TBB提供了一个特殊的功能模板:parallel_reduce。与您现在可能使用的parallel_for不同,parallel_reduce不需要body类的operator()为const,因为该类的实例会累积部分结果。但是,它对类提出了其他要求:需要一个特殊的构造函数以及一个合并来自另一个实体实例的部分结果的方法。

更多信息可在英特尔(R)TBB用户指南中找到:http://www.threadingbuildingblocks.org/docs/help/tbb_userguide/parallel_reduce.htm

还有一个parallel_reduce的重载,需要两个仿函数 - 一个用于身体,另一个用于合并部分结果 - 以及一个特殊的#34;身份&#34;用于初始化累加器的值。但是你一次计算三个聚合值,所以你仍然需要一个结构或类来将所有三个值存储在一个变量中。