首页 > 解决方案 > 多线程错误:找不到匹配的重载函数

问题描述

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

解决方案


自 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.


推荐阅读