我有一个名为MatrixAlt的类,我正在尝试多线程函数来对该矩阵进行一些处理。
当我在几个函数中实现它时,我的一般方法有效。但是当我尝试将它带入类方法时,我得到一个错误。
有问题的行(或者它突出显示的位置)是从末尾开始的4行,错误消息位于其上方的注释中。
#include <vector>
#include <future>
#include <thread>
class MatrixAlt
{
public:
MatrixAlt();
// initilaise the matrix to constant value for each entry
void function01(size_t maxThreads);
void function02(size_t threadIndex);
};
MatrixAlt::MatrixAlt()
{
}
void MatrixAlt::function02(size_t threadIndex)
{
// do some stuff
return;
}
void MatrixAlt::function01(size_t maxThreads)
{
// To control async threads and their results
std::vector<std::future<bool>> threadsIssued;
// now loop through all the threads and orchestrate the work to be done
for (size_t threadIndex = 0; threadIndex < maxThreads; ++threadIndex)
{
// line 42 gives error:
// 'MatrixAlt::function02': non-standard syntax; use '&' to create a pointer to member
// 'std::async': no matching overloaded function found
threadsIssued.push_back(std::async(function02, threadIndex));
}
return;
}
答案 0 :(得分:1)
你的第一个问题就像这样解决了
threadsIssued.push_back(std::async(&MatrixAlt::function02, this, threadIndex));
您需要指定确切的类::函数,并将其地址和用于执行该类的实例,然后再参数。
你还没有看到的第二个问题是这一行
std::vector<std::future<bool>> threadsIssued;
所有这些未来都会在范围退出时丢失,就像雨中的泪水一样。是时候毁灭了。
刀锋之后自由行动。
所有这些时刻都将在时间中消失,就像雨中的泪水一样。时间到了 死。
答案 1 :(得分:0)
每当在C ++中有成员函数时,该函数将对象本身作为隐式的第一个参数。所以你也需要传递对象,但即使这样,它也不能用与获取对象的普通函数相同的语法来调用。
在C ++中设置异步作业的最简单方法通常就是使用lambdas。他们非常清楚明确。因此,例如,您可以将呼叫更改为:
threadsIssued.push_back(std::async([this] (size_t t) { this->function02(t);}, threadIndex));
这个lambda显式捕获this
指针,它告诉我们所有function02
调用都将在调用调用function01
的同一对象上调用。
除了正确和明确之外,这还有助于突出重点:所有function02
个对象都将以对同一MatrixAlt
对象的可变访问权运行。这是非常危险的,所以你需要确保function02
是线程安全的,无论如何(如果它在概念上很常见,通常很容易,否则可能需要互斥,或其他)。