gpt4 book ai didi

c++ - 尝试使用 std::thread 时出现编译器错误

转载 作者:行者123 更新时间:2023-11-27 22:35:27 25 4
gpt4 key购买 nike

当我尝试使用 std::thread 执行函数时遇到编译器错误。错误显示:“错误 C2672:‘std::invoke’:未找到匹配的重载函数”。

这是一个代码片段:

void GetMinMax_X(const std::vector<Vertex>& iAllVertices, double & oMin_X, 
double & oMax_X)
{
auto MinMax_X = std::minmax_element(iAllVertices.begin(),
iAllVertices.end(), [](const Vertex& i, const Vertex& j)
{
return i.GetX() < j.GetX();
});
oMin_X = MinMax_X.first->GetX();
oMax_X = MinMax_X.second->GetX();
}

int main()
{
std::vector<Vertex>;
// Some functions to fill the Vertex vector......

double Min_X = 0;
double Max_X = 0;
std::thread first (GetMinMax_X, AllVertices, Min_X, Max_X);
first.join();

return 0;
}

谢谢!

最佳答案

出现错误是因为 std::thread 在后台使用 std::invoke 调用 GetMinMax_X,但参数已复制/移动。特别是你cannot使用

void GetMinMax_X(const std::vector<int>& iAllVertices, double & oMin_X, double & oMax_X)

因为您将形成对拷贝的引用,这不是您想要的。

could still use

void GetMinMax_X(const std::vector<int>& iAllVertices, const double & oMin_X, const double & oMax_X)

但这不会帮助您将值返回到主线程中。

解决方案是使用std::ref:

std::thread first(GetMinMax_X, AllVertices, std::ref(Min_X), std::ref(Max_X));

https://godbolt.org/z/ClK3Cb

另请参阅 cppreference 对 std::thread 的看法(其中描述了此“限制”和解决方法):

https://en.cppreference.com/w/cpp/thread/thread/thread

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

Any return value from the function is ignored. If the function throws an exception, std::terminate is called. In order to pass return values or exceptions back to the calling thread, std::promise or std::async may be used.

关于c++ - 尝试使用 std::thread 时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54888734/

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