gpt4 book ai didi

c++ - 使用线程编程时出现 std::thread::_Invoker 错误

转载 作者:太空狗 更新时间:2023-10-29 21:33:11 28 4
gpt4 key购买 nike

编辑:我正在尝试学习如何在 C++ 中使用线程。我的代码有问题,它给了我以下错误:

no matching function for call to 'std::thread::_Invoker<std::tuple<void (matrix_product<int, 0, 0>::*)(matrix_wrap<int>&, int, const matrix_wrap<int>&, const matrix_wrap<int>&), matrix_wrap<int>, int, matrix_wrap<int>, matrix_wrap<int> > >::_M_invoke(std::thread::_Invoker<std::tuple<void (matrix_product<int, 0, 0>::*)(matrix_wrap<int>&, int, const matrix_wrap<int>&, const matrix_wrap<int>&), matrix_wrap<int>, int, matrix_wrap<int>, matrix_wrap<int> > >::_Indices)'
operator()()

这是给我错误的一段代码(在我写这个之前它是有效的):

void do_multiply_fico(matrix_wrap<T> result, matrix_wrap<T> lhs, matrix_wrap<T> rhs) {
// Create an array of threads
std::thread threads[lhs.get_height()];
for (int i = 0; i < lhs.get_height(); ++i) {
// Initialize each thread with the function responsible of multiplying only a part of the matrices
threads[i] = std::thread(multiply_threading, result, i, lhs, rhs);
}
for (int i = 0; i < lhs.get_height(); ++i) {
// Wait until each thead has finished
threads[i].join();
}
}

void multiply_threading(matrix_wrap<T>& result, const int thread_number, const matrix_wrap<T>& lhs, const matrix_wrap<T>& rhs){
const unsigned height = result.get_height();
const unsigned width = result.get_width();
const unsigned span = lhs.get_width();
assert(span==rhs.get_height());
for (unsigned i=0; i!=height; ++i) {
for (unsigned j = 0; j != width; ++j) {
for (unsigned k = 0; k != span; ++k) {
result(i, j) += lhs(i, k) * rhs(k, j);
}
}
}

}

在此先感谢您的帮助。

最佳答案

看起来您正在尝试从成员函数构造 std::thread。这是行不通的:您需要一个实例来调用它。

您还有一个更严重的问题,因为默认情况下,引用参数将作为值类型传递给 thread 构造函数。您需要将它们包装在 std::ref 中以使其编译并展示预期的行为。

不过,更简单的方法是将 lambda 传递给 std::thread:

threads[i] = std::thread([this, &result, i, &lhs, &rhs](){
multiply_threading(result, i, lhs, rhs);
});

这样参数的包装是通过 lambda 捕获完成的,而不是通过 std::thread 的变幻莫测。 (引用捕获在某些情况下可能是不安全的,但由于您将所有内容都加入到同一个函数中,因此您无需担心这一点。)请注意,i 是按值捕获的,因为您我们将在以后的迭代中更改它的值,并且需要您已经创建的线程来捕获它在创建它们时所具有的值。

关于c++ - 使用线程编程时出现 std::thread::_Invoker 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52311616/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com