Lambda表达式的执行策略问题

时间:2018-09-10 14:02:01

标签: c++ c++17

我上了这个课:

class EMX_Counter {
    private:
        std::vector<std::unique_ptr<WireBase>> WiresList;
    public:
        EMX_Counter(const std::vector<std::unique_ptr<WireBase>>& w) : WiresList(w) {}
        EMX_Counter(std::vector<std::unique_ptr<WireBase>>&& w) : WiresList(std::move(w)) {}
        std::future<std::vector<double>> getEmxEfficiency();
    };

WireBase是一个抽象类(在这里它的工作方式并不重要),我需要一个唯一的ptr,因为我需要多态性。也就是说,getEmxEfficiency()需要花费一些时间,因为向量包含至少28'000 / 30'000项,并且对该方法的一个调用很慢。

我决定使用并行方法来加快速度,这就是结果:

std::future<std::vector<double>> EMX_Counter::getEmxEfficiency()  {
        return std::async([*this]() {
            std::vector<double> temp;               

            std::for_each(std::execution::par, WiresList.begin(), WiresList.end(), [&](auto& PolyObject) {
                double result = PolyObject->getPartialEfficiency();
                //more time-expensive operations
                temp.push_back( result );
            });

            return temp;
        });
    }

调用PolyObject->getPartialEfficiency();返回一个double且不引发异常,这是“安全的”。


我正在使用最新的Visual Studio版本(昨天更新)和标志/std:c++17。问题是我收到此错误:

 std::unique_ptr<WireBase,std::default_delete<_Ty>>::unique_ptr(const
 std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to
 reference a deleted function (file: xmemory0).
  • 这可能是什么?
  • 我在lambda中捕获了[*this],所以我有该对象的副本,并且我确定(是吗?)异步执行不会有问题。我应该改为通过参考值捕获吗?

for_each lambda中,我已经被引用捕获了,因为temp在范围内,并且销毁它不会有问题。

1 个答案:

答案 0 :(得分:1)

我应该改用以下代码:

Any::toString

fun <T> doSomething(value: T, action: (t: T) -> String = Any::toString as (T) -> String) { // ... } 声明为SELECT SalesValue, Department, Period FROM ( SELECT SalesValue, Department, Period FROM <table>) up PIVOT (SUM(Sales) FOR SalesValue IN (Department, Period)) AS pvt ORDER BY Period 的地方。现在该变量已受保护,并且由于共享指针,我不再有编译时问题!