c++ - 多线程错误:找不到匹配的重载函数
问题描述
大家好,我是 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 以来(特别是引入 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
.
推荐阅读
- linux - 将 find & exec 的输出重定向到日志文件
- java - 将内部带有 var 的 for each 循环转换为 Java Stream?
- c# - C#按钮单击,显示图像然后退出
- vue.js - 使用日期选择器 Vuetify 动态表单输入
- android - Codetrix 电容器 google 登录需要登录时的选项
- typescript - 如何为现有属性的 TypeScript 接口添加别名?
- sapui5 - 当只剩下一个选择项时如何禁用 sap.m.Select
- docker - 难以附加状态容器?
- swift - 如果没有上下文类型,则无法解析对成员“下标”的引用
- python - 将一个以 DataFrame 列作为参数的函数应用于整个 DataFrame