尝试使用std ::线程时编译器错误

Compiler error when trying using std::thread

本文关键字:线程 编译器 错误 std      更新时间:2023-10-16

我尝试使用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,但随着参数复制/移动。特别是,您不能使用

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

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

您仍然可以使用

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

另请参见有关std::thread的cppReference(其中描述了"限制"answers"限制"):

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

通过值移动或复制线程函数的参数。如果需要将参考参数传递给线程函数,则必须包装它(例如,使用STD :: Ref或STD :: CREF)。

从函数中的任何返回值都将被忽略。如果功能引发异常,则调用std :: terminate。为了将返回值或异常传递回通话线程,可以使用std :: Promise :: async。