c++ - 尝试使用 std::thread 时出现编译器错误
问题描述
当我尝试使用 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));
另请参阅 cppreference 必须说的内容std::thread
(描述了此“限制”和解决方法的地方):
https://en.cppreference.com/w/cpp/thread/thread/thread
线程函数的参数按值移动或复制。如果需要将引用参数传递给线程函数,则必须对其进行包装(例如,使用 std::ref 或 std::cref)。
函数的任何返回值都会被忽略。如果函数抛出异常,则调用 std::terminate。为了将返回值或异常传递回调用线程,可以使用 std::promise 或 std::async。
推荐阅读
- pandas - 从 Pandas 数据框列标题中提取信息
- excel - 从关闭的 SharePoint 文件读取的 Excel VBA 不起作用
- javascript - 在画布JavaScript中将多色图像转换为单色图像
- python - 如何在 keras 中使用“sample_weight”
- mongodb - Mongoose 指定可选的对象数组
- sql - 使用嵌入式 CURSOR 查询 - 错误是什么?
- excel - 过滤条件 1 和条件 2 在日期列上未定义
- r - 检查期间未找到导出的 S3 方法
- typescript - 无法使用 web-assembly rust impl,因为“初始化前无法访问 '__wbindgen_throw'”错误
- html - 从使用 jquery 的文本文件创建的选择下拉列表中捕获选定的项目值