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

时间:2018-11-24 06:13:23

标签: c++ multithreading

大家好,我是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)

如果能提供帮助,我将不胜感激。 谢谢

2 个答案:

答案 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函数是静态的。非常抱歉,谢谢您为我提供帮助