gpt4 book ai didi

c++ - lambda 表达式的执行策略问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:53 25 4
gpt4 key购买 nike

我有这门课:

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() 需要一些时间,因为 vector 至少包含 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,因为 temp 在范围内,我不会遇到它被销毁的问题。

最佳答案

我应该改用这段代码:

//global
auto mymutex = std::mutex{};

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

std::for_each(std::execution::par, WiresList.begin(), WiresList.end(), [&](auto& PolyObject) {

//your code...

auto lock = std::lock_guard<std::mutex>{ mymutex };
temp.push_back( result );
});

return temp;
});
}

在哪里WiresList声明为 std::vector<std::shared_ptr<WireBase>> .现在变量受到保护,我不再有编译时问题,因为有一个共享指针!

关于c++ - lambda 表达式的执行策略问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52259525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com