多线程错误:找不到匹配的重载函数



大家好,我是c++的新手,正在研究如何让多线程工作。我正在做的是尝试在一个向量中推动5个线程,并使它们乘以2个矩阵。然而,我不断地得到这个错误。我知道这会被标记为重复,但我之所以这么问,是因为我真的找不到关于线程的其他类似问题。

根据下面的代码,我得到的错误如下:

错误C2672"std::invoke":找不到匹配的重载函数

C2893无法专用化函数模板"未知类型std::invoke(_Callable&&,_Types&&…(noexcept((">

这是我的代码

#include "matrices.h"
#include <memory>
#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <algorithm>
using namespace std;
int main()
{
std::vector<std::thread> threads;
CMatrix3 matrix1, matrix2, result;
std::thread::hardware_concurrency();
matrix1.SetElement(0, 0, 2);
matrix1.SetElement(0, 1, 2);
matrix1.SetElement(0, 2, 3);
matrix1.SetElement(0, 3, 1);
matrix1.SetElement(1, 0, 0);
matrix1.SetElement(1, 1, 0);
matrix1.SetElement(1, 2, 2);
matrix1.SetElement(1, 3, 5);
matrix1.SetElement(2, 0, 1);
matrix1.SetElement(2, 1, 6);
matrix1.SetElement(2, 2, 2);
matrix1.SetElement(2, 3, 0);
matrix1.SetElement(3, 0, 0);
matrix1.SetElement(3, 1, 2);
matrix1.SetElement(3, 2, 0);
matrix1.SetElement(3, 3, 2);
matrix2.SetElement(0, 0, 1);
matrix2.SetElement(0, 1, 1);
matrix2.SetElement(0, 2, 1);
matrix2.SetElement(0, 3, 1);
matrix2.SetElement(1, 0, 1);
matrix2.SetElement(1, 1, 1);
matrix2.SetElement(1, 2, 1);
matrix2.SetElement(1, 3, 1);
matrix2.SetElement(2, 0, 1);
matrix2.SetElement(2, 1, 1);
matrix2.SetElement(2, 2, 1);
matrix2.SetElement(2, 3, 1);
matrix2.SetElement(3, 0, 0);
matrix2.SetElement(3, 1, 2);
matrix2.SetElement(3, 2, 0);
matrix2.SetElement(3, 3, 2);
for (unsigned i = 0; i<5; ++i)
{
threads.push_back(std::thread(CMatrix3::Multiply, &matrix1, std::ref(matrix1), std::ref(matrix2), std::ref(result)));
}
std::for_each(threads.begin(), threads.end(),std::mem_fn(&std::thread::join));
result.display4by4(result);
int h;
cin >> h;
return 0;
}

CMatrix3::Multiply是类CMatrix3的入口点函数,它包含3个参数matrix1、matrix2和结果矩阵,该矩阵是两个相乘矩阵的结果的单位矩阵。即;这就是的样子

CMatrix3 & CMatrix3::Multiply(const CMatrix3 & _rA, const CMatrix3 & _rB, CMatrix3 & _rResult)

如果你能帮忙,我将不胜感激。感谢

由于c++11(特别是引入了lambdas和基于范围的for(,诸如bind、mem_fn和cref之类的构造变得不那么相关了。

你可以像这样实现你想要做的事情(假设我已经正确地推断了CMatrix3的接口(:

for (unsigned i = 0; i<5; ++i)
{
// static interface
threads.emplace_back([&]{ CMatrix3::Multiply(matrix1, matrix2, result); });
// or it could be one of these, depending on CMatrix3's interface:
// threads.emplace_back([&]{ matrix1.Multiply(matrix2, result); });
// threads.emplace_back([&]{ result = matrix1.Multiply(matrix2); });

}
for(std::thread& thread : threads) thread.join();

然而,就本例而言,这将导致未定义的行为,因为所有五个线程都将竞相覆盖result中的数据。

嗨,所以我刚刚修复了这个错误。for循环中的正确代码应该是threads.push_back(std::thread(CMatrix3::Multiply,std::ref(matrix1), std::ref(matrix2), std::ref(result)));与添加了额外参数的CCD_ 3 I相反
最重要的是,当我在指定入口点后使用对象作为第二个参数时,它引发错误的原因是因为Multiply函数是静态的。我道歉并感谢你们试图帮助我

最新更新