大家好,我是c ++的新手,正在致力于使多线程工作。 我正在做的是尝试将5个线程推入向量中并使它们乘以2个矩阵。但是我一直收到此错误。我知道这将被标记为重复,但是我只是在问,因为我真的找不到关于线程的另一个类似问题。
基于以下代码,我得到的错误如下:
错误C2672'std :: invoke':找不到匹配的重载函数
C2893无法专用于功能模板'unknown-type 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)
如果能提供帮助,我将不胜感激。 谢谢
答案 0 :(得分:0)
自c ++ 11(特别是引入lambda和基于范围的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
中的数据。
答案 1 :(得分:0)
嗨,我只是解决了这个错误。 for循环内正确的代码应该是threads.push_back(std::thread(CMatrix3::Multiply,std::ref(matrix1), std::ref(matrix2), std::ref(result)));
与threads.push_back(std::thread(CMatrix3::Multiply, &matrix1,std::ref(matrix1), std::ref(matrix2), std::ref(result)));
相反,我添加了一个额外的参数。
除此之外,在指定入口点后将对象用作第二个参数时,它引发错误的原因是因为Multiply函数是静态的。非常抱歉,谢谢您为我提供帮助