尝试使用std ::线程时编译器错误
Compiler error when trying using 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));
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。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在Windows 10上使用C 中的线程(使用G 作为编译器)的问题
- 尝试使用std ::线程时编译器错误
- 编译器优化是否解决了线程安全问题
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- STD线程呼叫模板模板类的成员功能:编译器错误
- C++编译器中的线程
- 对于 c++11 之前的编译器,返回本地静态对象线程是否安全
- 计时器、线程和编译器不当行为
- 线程池的 lambda 函数内的编译器错误变量"未捕获"
- C++编译器:为不同线程整理的接口
- 多线程可能会抑制编译器优化
- GCC-Visual Studio std::线程编译器的差异
- 现在的C和C++编译器的线程保证是什么
- C++ 编译器如何保证常量成员变量的线程安全
- visual studio 2010 -是否有办法在旧的C/ c++编译器中使用c++ 11线程对象?